【发布时间】:2016-10-10 19:07:31
【问题描述】:
出于安全考虑,我想静态链接所有库,包括包含 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 生成文件中:
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 文件 "/data/app/xxx-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]] 找不到“libtestlibrary.so”
【问题讨论】:
-
target_link_libraries至少接受 2 个参数:可执行文件/库和其他与之链接的库。在您的代码中,您只传递一个参数。 -
您试图通过使用静态库而不是动态库来解决哪些安全问题?静态库(如果有的话)包含比共享库更多的信息,而不是更少。
-
我试图避免有人决定用自定义库中的假函数覆盖共享库中的函数。
-
Tsyvarev,我认为附加参数是可选的。实际上,我在第一个参数之后列出了其他库,但这与我的问题无关)
标签: android android-ndk cmake java-native-interface