共计 1230 个字符,预计需要花费 4 分钟才能阅读完成。
JNI 应用教程
-
编写 Java 测试类
public class TestJNI { // 定义 native 办法 private native void say(); static { // 加载动静库 // 从以后门路或 java.library.path 查找, 去掉文件扩展名, macos 须要去掉 lib 前缀 System.loadLibrary("TestJNI"); // 或者应用文件绝对路径加载 // System.load("/path/to/TestJNI.so"); } public static void main(String[] args) {new TestJNI().say();} }
-
利用 Java 类生成 C++ 头文件
javah TestJNI
批改
TestJNI.h
中#include <jni.h>
->#include "jni.h"
这样会优先从当前目录寻找jni.h
头文件 -
编写
TestJNI.cpp
文件#include "TestJNI.h" JNIEXPORT void JNICALL Java_TestJNI_say (JNIEnv *env, jobject obj) {printf("hello world"); }
-
编译 C++ 代码, 生成动态链接库
-
拷贝依赖的 JNI 相干头文件到当前目录, 或者应用 gcc 编译时指定参数
-I $JAVA_HOME/include -I $JAVA_HOME/include/darwin
cp $JAVA_HOME/include/jni.h . cp $JAVA_HOME/include/darwin/jni_md.h .
-
编译
- Linux
gcc -shared TestJNI.cpp -o TestJNI.so
- MacOS
gcc -dynamiclib TestJNI.cpp -o libTestJNI.dylib -I $JAVA_HOME/include -I $JAVA_HOME/include/darwin
- Windows
gcc -shared TestJNI.cpp -o TestJNI.dll -I $JAVA_HOME/include -I $JAVA_HOME/include/darwin
-
- 编译运行 Java Class
javac TestJNI.java
java TestJNI
- 附: 如何查看
java.library.path
地址
public class PrintJavaLibPath {public static void main(String[] args) {String[] split = System.getProperty("java.library.path").split(":");
for (String string : split) {System.out.println(string);
}
}
}
源码
https://github.com/kense-lab/…
参考
- Java 深刻 JVM 源码外围探秘 Unsafe(含 JNI 残缺应用流程)
- Java – 如何应用 dylib 文件?
- Java 加载 dll 或 so 库文件的门路 java.library.path
正文完