加载静态编译的Java库
Load statically compiled library in Java
我在使用System.loadLibrary(")从Java加载静态编译库时遇到了麻烦,但我可以将其加载为动态编译库(当我以这种方式构建它时)。我正在使用JDK 8,我的理解是,如果你在*.cpp和*.h文件中提供JNI_OnLoad_L,它可以通过System.loadLibrary(")加载静态库。
My kdu_jni.h has:
extern "C"
JNIEXPORT jint JNICALL JNI_OnLoad_kdu_1jni(JavaVM *, void *);
My kdu_jni.cpp has:
JNIEXPORT jint JNICALL JNI_OnLoad_kdu_1jni(JavaVM *vm, void *reserved)
{
return JNI_VERSION_1_8;
}
我有libkdu_jni。当我尝试使用编译后的版本运行时,我的java.library.path目录中的一个文件。它可以很好地与libkdu_jni一起工作。当我尝试动态加载时,在同一目录下。当尝试使用静态文件(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。一个文件的JNI_OnLoad_kdu_1jni()因为我在那里放了一个异常,我没有看到它被抛出。我已经尝试了几个迭代的名称:JNI_OnLoad_kdu_jni(), JNI_OnLoad_kdu_1jni(), JNI_OnLoad()等。
任何想法?
我的理解是,如果你在*.cpp和*.h文件中提供JNI_OnLoad_L,它可以通过System.loadLibrary(")加载静态库。
你的理解不正确。不能动态加载.a
文件。它不能以任何形式执行:
- 库内引用未解析
- 库外的引用也不解析:例如,到C库。
链接步骤是必要的,JVM不会为您完成它。您所阅读的内容适用于静态链接到JVM中的库
我建议您尝试JNI_OnLoad_kdu_jni
作为函数名。如果这不起作用,则可能对包含下划线的库名不起作用。
——原文跟随——
在Java 8之前,只支持共享对象库。
这意味着要知道静态库是否是Java 8,必须在库中实现一个新函数。
JNI_OnLoad_libname must return a value of JNI_VERSION_1_8 or higher.
我猜因为你的代码是动态工作的,但不是静态的,也许这个函数不存在。下面的JEP 178部分让我相信这一点:
java.lang.System.loadLibrary和java.lang.Runtime.loadLibrary方法将被修改为:
加载由libname参数指定的本机库。libname不能包含任何特定于平台的前缀、文件扩展名、或路径。
如果一个名为libname的本地库与虚拟机静态链接,则JNI_OnLoad_libname函数由库被调用。有关更多细节,请参阅JNI规范。
否则,libname从系统库位置加载,并映射到本地库映像具体实现相关的方式。
增强版中的注释也呼应了这一观点
加载器的源代码很有帮助
我会在调试(gdb)下启动java,并在Java_java_lang_ClassLoader_00024NativeLibrary_findBuiltinLib
处设置断点。你说得对,好的例子并不多。
- 尝试用java代码编译和运行c++代码
- 在由Sublime文本3编译后在cmd上显示Java程序输出
- 编译 Java TD 客户端时出现构建错误
- 在为 Java 编译动态链接文件时,我应该选择哪些 g++ 参数
- 使用 C++ 编译和运行 java 文件时无法装入主类
- 在SWIG和Visual Studio 2015中使用Java中编译的DLL
- 在Java(JNI)中与Mingw C 一起编译64位静态LIB
- 如何在Raspberry pi中使用JNI GPIO原生库编译和运行Java程序
- 用java编写源代码,并将其编译为其他语言的各种可执行文件?多重编译
- 使用jni.h在C++中编译java方法时出现构建错误
- 如何编译Java原生库
- 在Java/PHP/Python框架内,在编译的C/C++代码中运行算法
- 通过JNI调用简单的java静态方法是不起作用的,尽管c++编译并运行它
- 我们有没有像c一样用java进行条件编译
- 为什么这个布尔值在 C++ 而不是 Java 中编译
- 使用通配符编译 Java 泛型以C++模板
- 如何使用C++编译.java文件
- 在机器上运行时,编译的源代码(C++、Java 等)涉及哪些安全问题
- 使用 Java 1.5 编译节俭生成的类时出错
- 从 Java 编译 c++ 文件