MENU

JNI随笔

May 15, 2022 • 学习笔记

一个JNI Demo

编写这样一个类,里面要有调用原生方法Native

image-20191226164242494

Build一下项目,生成out文件夹

image-20191226164448300

在项目根目录下执行javah命令生成.h头文件

image-20191226164717081

javah -jni -classpath [搜索路径] -d [头文件输出路径] [完整类名]
//JDK8之后javah的功能被加入进javac -h 中
//JDK10之后移除了javah

自动生成头文件如下图:

image-20191226165047406

文件中自动生成了方法声明 Java\_[包名]\_[类名]\_[方法名]()

可以在VSCode中打开这个目录进行编码

image-20191226165523153

  1. 建立一个.c/.cpp文件
  2. include生成的头文件
  3. 将头文件中生成的函数声明复制进去
出现引用错误可以在.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
}
  1. 编写逻辑

image-20191226170435460

编译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文件

回到JAVA中便可以执行

image-20191226171404837

疑问:为何顺序出现问题?