JNI 应用教程

  1. 编写 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();    }}
  2. 利用 Java 类生成 C++ 头文件

    javah TestJNI

    批改 TestJNI.h#include <jni.h> -> #include "jni.h"
    这样会优先从当前目录寻找 jni.h 头文件

  3. 编写 TestJNI.cpp 文件

    #include "TestJNI.h"JNIEXPORT void JNICALL Java_TestJNI_say (JNIEnv *env, jobject obj) {    printf("hello world");}
  4. 编译 C++ 代码, 生成动态链接库

    1. 拷贝依赖的 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 .
    2. 编译

      • 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
  5. 编译运行 Java Class
javac TestJNI.javajava 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