Android NDK cmake JNI静态库

时间:2016-10-10 19:07:32

标签: android android-ndk cmake java-native-interface

由于安全问题,我想静态链接所有库,包括我的包含JNI_OnLoad函数的本机库。我已经读过可以静态链接JNI库(http://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/invocation.html#library_version),但我没有使用Android Studio。有可能吗?

这是我目前所拥有的。

在Java代码中:

System.loadLibrary("testlibrary");

在cmake makefile中:

add_library( testlibrary
         STATIC
         ${mysources} )
target_link_libraries(testlibrary)

在C ++文件中:

extern "C" {
EXPORT
JNIEXPORT jint JNICALL JNI_OnLoad_testlibrary(JavaVM *vm, void *reserved) {
   ...
   return JNI_VERSION_1_8;
}

使用Android Studio构建时,应用程序失败,因为它尝试查找* .so库文件:

  

java.lang.UnsatisfiedLinkError中:   dalvik.system.PathClassLoader [DexPathList [[zip文件   #&34; /data/app/xxx-1/base.apk"],nativeLibraryDirectories = [/供应商/ lib中,   / system / lib]]]无法找到" libtestlibrary.so"

1 个答案:

答案 0 :(得分:1)

System.loadLibrary("testlibrary");

此行尝试加载libtestlibrary.so,显然它没有构建并打包到APK中,因为具有此名称的库是静态的:

add_library( testlibrary
         STATIC
         ${mysources} )

此处您已经描述了目标libtestlibrary.a,这是无法加载的,并且只能与可加载的.so相关联。因此,为了获得所需的结果,您应该将testlibrary声明为共享的,然后将其链接到另一个静态库。结果,您将获得一个可以加载到程序地址空间的单一共享库。 E.g

add_library(testlibrary SHARED ${mysources})
add_library(lib1 STATIC ${lib1_src})
add_library(lib2 STATIC ${lib2_src})
...
target_link_libraries(testlibrary lib1 lib2 ...)