由于安全问题,我想静态链接所有库,包括我的包含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"
答案 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 ...)