Java native方法采用C++语言实现,需要包含头文件 jni.h
1. 编写 .java 库文件
1 | // JNILib.java |
这是Linux下的实现,加载的动态链接库文件是libtest.so,如果是Windows,则需要将test修改为test.dll
2. 生成头文件与函数声明
1 | javac LNILib.java |
此时,会在同级目录下生成JNILib.h的头文件,该头文件需要引用来自 $JAVA_HOME/include 下的 jni.h 和 $JAVA_HOME/include/linux 下的 jni_md.h (对于Windows,这个头文件是$JAVA_HOME\include\win32 下的jni.md.h)
3. 编写实现函数
将JNILib.cc中生成的函数声明拷贝到源文件.cc中加以实现:
1 | #include "JNILib.h" |
4. 编译动态链接库
1 | export LD_LIBRARY_PATH="$LD_LIBRARAY_PATH:/home/wsd/STEM/Experiments/Java/jni" |
参数解释:export LD_LIBRARY_PATH
需要添加当前目录的绝对路径,否则会报告java.lang.UnsatisfiedLinkError: no libtest.so in java.library.path
的错误,可以通过命令 java -XshowSettings:properties
检查当前目录是否在其中。-fPIC
表示编译为位置独立的代码,如果不用此选项编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。-shared
表示制定生成动态链接库。不用该标志只相当于一个可执行文件,外部程序无法连接。-I
添加.h文件要连接的库所在的目录
编译后可通过ldd检查是否正确连接:
1 | wsd@arch $ ldd libtest.so [0] |
5. 执行测试
1 | java JNILib |
Comments
shortname
for Disqus. Please set it in_config.yml
.