包括使用NDK的预编译静态LIbrary

我正在寻找包括我的Android Studio NDK项目中预编译的静态库。 我正在使用Android Studio 1.0.1,并且任何在SO上尝试这个问题的解决scheme都显得过时(或涉及到创build一个库项目并将其包含在内)。

结构如下:

app /--src /--main /--java +--jni +--jniLibs /--armeabi /--libpng.a --armeabiv7 /--libpng.a ...(for each abi) 

我正在试图包括库libpng。 我试图创buildjniLibs(根据ph0b (真棒指南,btw)和libpng.a添加到相应的ABI文件夹。这仍然给我错误 – 无法find-llibpng当我尝试编译与下面的代码:

 ndk { moduleName "game" cFlags "-std=c++11 -fexceptions -DANDROID -I${project.buildDir}/../src/main/jni/include \ -I${project.buildDir}/../src/main/jni/include/png" ldLibs "EGL", "GLESv3", "dl", "log", "android", "libpng" stl "gnustl_static" } 

Solutions Collecting From Web of "包括使用NDK的预编译静态LIbrary"

这现在通过实验插件正常工作。

有关完整的描述,请参阅这篇完整的文章 ,这是我从中得到的,但我也自己使用它,它的工作原理。

这是我的build.gradle – 请注意,在我的情况下,这是一个库项目,我使用静态链接,而不是共享。

 buildscript { dependencies { classpath "com.android.tools.build:gradle-experimental:0.7.0-alpha3" } } apply plugin: 'com.android.model.library' model { repositories { libs(PrebuiltLibraries) { v8_base { binaries.withType(StaticLibraryBinary) { staticLibraryFile = file("src/main/jni/libs/${targetPlatform.getName()}/libv8_base.a") } } v8_libbase { binaries.withType(StaticLibraryBinary) { staticLibraryFile = file("src/main/jni/libs/${targetPlatform.getName()}/libv8_libbase.a") } } v8_libplatform { binaries.withType(StaticLibraryBinary) { staticLibraryFile = file("src/main/jni/libs/${targetPlatform.getName()}/libv8_libplatform.a") } } v8_nosnapshot { binaries.withType(StaticLibraryBinary) { staticLibraryFile = file("src/main/jni/libs/${targetPlatform.getName()}/libv8_nosnapshot.a") } } } } android { compileSdkVersion 23 buildToolsVersion "23.0.2" sources { main { jni { source { srcDir "src/main/jni" } dependencies { library "v8_base" linkage "static" library "v8_libbase" linkage "static" library "v8_libplatform" linkage "static" library "v8_nosnapshot" linkage "static" } } } } ndk { moduleName "v8example" cppFlags.add("-std=c++11") cppFlags.add("-I${file("src/main/jni/include")}".toString()) cppFlags.add("-fexceptions") ldLibs.add("log") stl "stlport_static" abiFilters.add("armeabi armeabi-v7a x86") } } } 

另一种方法是使用旧的Gradle方法来调用ndkBuild,从而使用.mk文件。 这也很好,但你失去了与Android Studio的良好整合,例如你的jni文件正确显示。

在Android Studio 1.0.2中添加.so库

  1. 在“src / main /”里创build文件夹“jniLibs”
  2. 将所有.so库放在“src / main / jniLibs”文件夹中
  3. 文件夹结构看起来像,
    | –app:
    | – | –src:
    | – | – | – 主
    | – | – | – | –jniLibs
    | – | – | – | – | –armeabi
    | – | – | – | – | – | – 。so文件
  4. 没有额外的代码只需要同步你的项目并运行你的应用程序。

    参考
    https://github.com/commonsguy/sqlcipher-gradle/tree/master/src/main

由于ndk支持现在在gradle中受到限制,您可以尝试使用这种方法来获取不同abi的静态库。

  ndk { moduleName "game" .... ldLibs ..., file(projectDir).absolutePath+"/src/main/jniLibs/\$(TARGET_ARCH_ABI)/libpng.a" .... } 

你不能只包含.so文件,你还需要有src文件夹,它们实际上提供了访问那些.so文件中的方法的接口。 我build议不要把你的项目与图书馆联系起来。

最好的方法是将其作为android studio的库模块,并放弃jni文件夹以禁用ndkbuild,并通过向build.gradle文件中添加以下内容将jnilib指向/ libs文件夹

 jni.srcDirs = [] //disable automatic ndk-build call jniLibs.srcDirs = [ 'libs' ] //no need to copy the .so files from /libs to /jniLibs folder 

(检查libs目录是否已经被android studio用.so文件正确导入)

导入库作为模块自动处理

a) yourlibrary库文件夹在您的项目文件夹中并根据gradle惯例进行重构b)导入项目(在settings.gradle中包含': yourlibrary ')和
c)创build依赖关系(“文件 – >项目结构 – >从左侧子窗口select主应用程序模块 – >依赖项(最后一个选项卡) – >按右侧绿色的”+“ – > yourlibrary作为模块依赖项 – >确定” )

这真的很丑,但它的作品! 你可以让Gradle把你的代码注入到生成的Android.mk文件中:

  ndk { abiFilter "armeabi-v7a" // We need to inject the static library into the // NDK build, and Gradle doesn't offer a way to directly // modify the Android.mk file... So we hack it! // // You can see the end result at: // build/intermediates/ndk/debug/Android.mk moduleName "This_is_a_terrible_Gradle_hack\n" + "include \$(CLEAR_VARS)\n" + "LOCAL_MODULE := mystaticlib_prebuilt\n" + "LOCAL_EXPORT_C_INCLUDES := mystaticlib/include\n" + "LOCAL_SRC_FILES := mystaticlib/libmystaticlib.a\n" + "include \$(PREBUILT_STATIC_LIBRARY)\n" + "include \$(CLEAR_VARS)\n" + "LOCAL_MODULE := MyActualModule\n" + "LOCAL_STATIC_LIBRARIES += mystaticlib_prebuilt" cFlags "-std=c++11 -fexceptions -frtti -pthread" stl "gnustl_shared" ldLibs "log", "OpenSLES", "z" }