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!

你可能感兴趣的:(jni)