Java 8 之前的 Java 版本要求本机代码位于共享库中,但我读到,在 Java 8 中可以将静态链接库与 JNI 一起使用。我搜索过示例但找不到任何示例。
如何将 JNI 库静态链接到我的 java 应用程序中?
Java SE 8规范已更改为支持静态链接,静态链接在JDK中实现。规范中简要提到了这一点系统加载库 http://docs.oracle.com/javase/8/docs/api/java/lang/System.html#loadLibrary-java.lang.String-。它引用的 JNI 规范的部分是here http://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/design.html#compiling_loading_and_linking_native_methods and here http://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/invocation.html#library_version.
静态和动态链接方法的本机方法签名和数据类型相同。不过,您可能需要修改 JDK makefile 才能使其静态链接您的库。
一个显着的区别是静态库的初始化方式。动态库的初始化是通过调用JNI_OnLoad
函数并通过调用来取消初始化JNI_OnUnload
。每个动态库都可以有自己的这些函数版本。如果有多个静态链接库,显然它们不可能都具有相同名称的函数。对于名为的静态库libname
加载/卸载函数是JNI_OnLoad_libname
and JNI_OnUnload_libname
.
The JNI_OnLoad_libname
函数必须返回一个值JNI_VERSION_1_8
或更高。如果没有,JVM 将忽略静态库。
基本上,如果你打电话System.loadLibrary("foo")
,系统寻找函数JNI_OnLoad_foo
在运行的可执行映像中,如果找到,则假定该库是静态链接的,并且在运行的映像中搜索其本机方法。如果JNI_OnLoad_foo
没有找到,则进行通常的动态库搜索和加载,并从找到的动态库中链接本地方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)