-
编写
native java
类JNIDemo.java
public class HelloJNI { static { System.setProperty("java.library.path", "."); System.loadLibrary("HelloJNI"); } native double add(double a, double b); public static void main(String[] args) { HelloJNI helloJNI = new HelloJNI(); double res = helloJNI.add(1.0, 2.0); System.out.println(res); } }
-
生成JNIDemo.class
javac JNIDemo.java
-
生成c头文件
javah -jni JNIDemo
JNIDemo.h
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class HelloJNI */ #ifndef _Included_HelloJNI #define _Included_HelloJNI #ifdef __cplusplus extern "C" { #endif /* * Class: HelloJNI * Method: add * Signature: (DD)D */ JNIEXPORT jdouble JNICALL Java_HelloJNI_add (JNIEnv *, jobject, jdouble, jdouble); #ifdef __cplusplus } #endif #endif
-
使用JNIDemo.h文件编写JNIDemo.cpp文件
JNIDemo.cpp#include "HelloJNI.h" JNIEXPORT jdouble JNICALL Java_HelloJNI_add (JNIEnv *, jobject obj, jdouble a, jdouble b) { return a + b; }
-
编译JNIDemo.cpp生成动态库文件
CMakeLists.txt
cmake_minimum_required(VERSION 3.19) project(jni-test) set(CMAKE_CXX_STANDARD 14) include_directories(/Library/Java/JavaVirtualMachines/jdk1.8. 0_271.jdk/Contents/Home/include) include_directories(/Library/Java/JavaVirtualMachines/jdk1.8. 0_271.jdk/Contents/Home/include/darwin) add_library(HelloJNI.jnilib SHARED HelloJNI.cpp)
命令
gcc -dynamiclib -I /Library/Java/JavaVirtualMachines/jdk1.8.0_271.jdk/Contents/Home/include -I /Library/Java/JavaVirtualMachines/jdk1.8.0_271.jdk/Contents/Home/include/darwin HelloJNI.cpp -o libHelloJNI.jnilib
-
拷贝libHelloJNI.jnilib到java项目目录
- 添加Native Library
-
运行输出结果