JNI学习总结
一:创建 HelloNative.java文件
vim HelloNative.java
class HelloNative {
public native static void greeting();
static {
System.loadLibrary("HelloNative");
}
}
二:编译 HelloNative.java 生成 HelloNative.class文件。
javac HelloNative.java
ls查看编译结果:
HelloNative.class HelloNative.java
三:利用javah产生一个C的头文件。javah可执行文件可以在jdk/bin目录下查找到。
javah HelloNative
ls查看结果:
HelloNative.class HelloNative.h HelloNative.java
四:编写HelloNative.c文件
vim HelloNative.c
#include "HelloNative.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_HelloNative_greeting(JNIEnv* env, jclass cl)
{
printf("Hello Native World!\n");
}
五:生成libHelloNative.so文件
gcc -fPIC -I /usr/lib/jvm/default-java/include -I /usr/lib/jvm/default-java/include/linux -shared -o libHelloNative.so HelloNative.c
ls查看结果:
HelloNative.c HelloNative.class HelloNative.h HelloNative.java libHelloNative.so
六:在HelloNative.java中加载libHelloNative.so库,如:
static {
System.loadLibrary("HelloNative");
}
七:编写测试代码HelloNativeTest.java
vim HelloNativeTest.java
class HelloNativeTest {
public static void main(String[] args) {
HelloNative.greeting();
return;
}
}
八:编译HelloNativeTest.java文件
javac HelloNativeTest.java
ls查看结果:
HelloNative.c HelloNative.class HelloNative.h HelloNative.java HelloNativeTest.class HelloNativeTest.java libHelloNative.so
当执行java HelloNativeTest 时,会报如下错误:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no HelloNative in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1681)
at java.lang.Runtime.loadLibrary0(Runtime.java:840)
at java.lang.System.loadLibrary(System.java:1047)
at HelloNative.<clinit>(HelloNative.java:4)
at HelloNativeTest.main(HelloNativeTest.java:3)
这时需要执行第九步。
九:把当前目录添加到库路径中:
java -Djava.library.path=. HelloNativeTest
或者 export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
十:终端输出最终结果:
Hello Native World!