Java native 方法实现

Java native方法采用C++语言实现,需要包含头文件 jni.h

1. 编写 .java 库文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// JNILib.java
public class JNILib {
// native声明,用于生成c/c++代码
public native int testCppFunc();

// 加载c/c++编译好的库
static {
System.loadLibrary("test");
}

public static void main(String[] args) {
int ans = new JNILib().testCppFunc();
System.out.println(ans);
}
}

这是Linux下的实现,加载的动态链接库文件是libtest.so,如果是Windows,则需要将test修改为test.dll

2. 生成头文件与函数声明

1
2
javac LNILib.java
javah -jni -classpath . JNILib

此时,会在同级目录下生成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
2
3
4
5
6
7
8
9
#include "JNILib.h"
#include <stdlib.h>

JNIEXPORT jint JNICALL Java_JNILib_testCppFunc(JNIEnv *env, jobject obj) {
int a = 1;
int b = 2;
jint c = a + b;
return c;
}

4. 编译动态链接库

1
2
export LD_LIBRARY_PATH="$LD_LIBRARAY_PATH:/home/wsd/STEM/Experiments/Java/jni"
g++ JNILib.cc -fPIC -shared -o libtest.so -I. -I/usr/lib/jvm/java-8-jdk/include -I$JAVA_HOME/include/linux

参数解释:
export LD_LIBRARY_PATH 需要添加当前目录的绝对路径,否则会报告java.lang.UnsatisfiedLinkError: no libtest.so in java.library.path的错误,可以通过命令 java -XshowSettings:properties 检查当前目录是否在其中。
-fPIC 表示编译为位置独立的代码,如果不用此选项编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
-shared 表示制定生成动态链接库。不用该标志只相当于一个可执行文件,外部程序无法连接。
-I 添加.h文件要连接的库所在的目录

编译后可通过ldd检查是否正确连接:

1
2
3
4
5
6
7
wsd@arch $ ldd libtest.so                                   [0]
linux-vdso.so.1 (0x00007fffd2df6000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007fb02c228000)
libm.so.6 => /usr/lib/libm.so.6 (0x00007fb02c0e4000)
libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007fb02c0c9000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007fb02befd000)
/usr/lib64/ld-linux-x86-64.so.2 (0x00007fb02c473000)

5. 执行测试

1
java JNILib
Linux进程间通信 SOA web service架构学习

评论

You forgot to set the shortname for Disqus. Please set it in _config.yml.
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×