我在使用 System.loadLibrary("") 从 Java 加载静态编译的库时遇到问题,但我可以将它作为动态编译的库加载(当我以这种方式构建它时)就好了。我正在使用 JDK 8,我的理解是如果您在 *.cpp 和 *.h 文件中提供 JNI_OnLoad_L,它可以通过 System.loadLibrary("") 加载静态库。
我的 kdu_jni.h 有:
extern "C"
JNIEXPORT jint JNICALL JNI_OnLoad_kdu_1jni(JavaVM *, void *);
我的 kdu_jni.cpp 有:
JNIEXPORT jint JNICALL JNI_OnLoad_kdu_1jni(JavaVM *vm, void *reserved)
{
return JNI_VERSION_1_8;
}
当我尝试使用编译版本运行时,我的 java.library.path 目录中有 libkdu_jni.a 文件。当我尝试动态加载它时,它与同一目录中的 libkdu_jni.so 文件一起工作正常。尝试使用静态文件 (libkdu_jni.a) 时,我得到:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no kdu_jni in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867)
at java.lang.Runtime.loadLibrary0(Runtime.java:870)
at java.lang.System.loadLibrary(System.java:1122)
我在尝试加载 .a 文件之前取出了 .so 文件。
我不确定我做错了什么。我认为它甚至没有看到 libkdu_jni.a 文件的 JNI_OnLoad_kdu_1jni() 因为我在那里放了一个异常而且我没有看到它被抛出。我已经尝试对该名称进行多次迭代:JNI_OnLoad_kdu_jni()、JNI_OnLoad_kdu_1jni()、JNI_OnLoad() 等。
有什么想法吗?
最佳答案
my understanding is it can load static libraries via System.loadLibrary("") if you provide a JNI_OnLoad_L in the *.cpp and *.h files.
你的理解有误。您不能动态加载 .a
文件。它不能以任何方式或形式执行:
- 未解决库内引用
- 库外的引用也未解析:例如,C 库。
链接步骤是必不可少的,JVM 不会为您完成。您所阅读的内容适用于静态链接到 JVM 的库。
关于java - 在 Java 中加载静态编译的库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39842117/