gpt4 book ai didi

Android NDK cmake JNI 静态库

转载 作者:行者123 更新时间:2023-11-30 00:57:02 25 4
gpt4 key购买 nike

出于安全考虑,我想静态链接所有库,包括包含 JNI_OnLoad 函数的 native 库。我读过可以静态链接 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 file "/data/app/xxx-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn't find "libtestlibrary.so"

最佳答案

System.loadLibrary("testlibrary");

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

add_library( testlibrary
STATIC
${mysources} )

此处您描述了目标 libteSTLibrary.a,它不可加载,只能链接到可加载的 .so。因此,为了获得预期的结果,您应该将 teSTLibrary 声明为共享库,然后将其链接到另一个静态库。结果,您将获得一个可以加载到程序地址空间中的整体式共享库。例如

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

关于Android NDK cmake JNI 静态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39965121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com