关于java:JNI-使用教程

29次阅读

共计 1230 个字符,预计需要花费 4 分钟才能阅读完成。

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.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

正文完
 0