一个JNI Demo
编写这样一个类,里面要有调用原生方法Native
Build一下项目,生成out文件夹
在项目根目录下执行javah命令生成.h头文件
javah -jni -classpath [搜索路径] -d [头文件输出路径] [完整类名]
//JDK8之后javah的功能被加入进javac -h 中
//JDK10之后移除了javah
自动生成头文件如下图:
文件中自动生成了方法声明 Java\_[包名]\_[类名]\_[方法名]()
可以在VSCode中打开这个目录进行编码
- 建立一个.c/.cpp文件
- include生成的头文件
- 将头文件中生成的函数声明复制进去
出现引用错误可以在.vscode中建立c_cpp_properties.json文件并加入以下内容
{
"configurations": [
{
"name": "Win32",
"includePath": [
"${workspaceFolder}/**",
"C:\\Program Files\\Java\\jdk1.8.0_231\\include", //jni
"C:\\Program Files\\Java\\jdk1.8.0_231\\include\\win32" //jni_md
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"compilerPath": "C:\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\mingw64\\bin\\gcc.exe",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "clang-x64"
}
],
"version": 4
}
- 编写逻辑
编译C/C++文件
g++ -c jnitest.cpp
缺少jni.h需要加入JDK目录下的include目录
缺少jni_md.h需要加入JDK目录下include/win32目录
于是变成如下命令
g++ -c -I"C:\\Program Files\\Java\\jdk1.8.0_231\\include" -I"C:\\Program Files\\Java\\jdk1.8.0_231\\include\\win32" jnitest.cpp
生成.o文件
生成.dll动态库
gcc -shared -o native-lib.dll jnitest.o
生成.dll文件