1、写一个带有native修饰的方法,注意包路径
package top.yumbo.jni; public class JNIHelloWorld { public static native String hello(); }
2、生成头文件
java10以后去除了javah,采用javac -h 代替
命令格式如下:javac -h 生成的.h文件目录 .java源文件
javac -h ./ top/yumbo/jni/JNIHelloWorld.java
java10以前可以使用生成头文件
javah -jni top/yumbo/jni/JNIHelloWorld.java
生成的_Included_top_yumbo_jni_JNIHelloWorld.h 名称可能会不一样,根据自己的结构和代码生成。
#include#ifndef _Included_top_yumbo_jni_JNIHelloWorld #define _Included_top_yumbo_jni_JNIHelloWorld #ifdef __cplusplus extern "C" { #endif JNIEXPORT jstring JNICALL Java_top_yumbo_jni_JNIHelloWorld_hello (JNIEnv * env, jclass jobj); #ifdef __cplusplus } #endif #endif
3、复制 JAVA_HOME 下的 include文件夹下的jni.h,以及include/win32里的jni_md.h
路径参考如下:根据自己的 JDK 路径找
将其复制到D:Program Filesmingw64x86_64-w64-mingw32include下,与你的MingGW存放路径有关
我的路径如下
2.1 把默认生成的c/cpp/h文件删除,目录结构如下,将javac编译生成的.h文件更名为.cpp文件(偷懒,因为头文件include就是全部引入到.c/.cpp文件中,和同一个文件是同一个道理)
直接修改函数声明,直接就是函数声明+定义如下代码(比较简单,自己手敲吧)
修改CMakeLists.txt文件,因为项目编译就是根据这个文件记录那些文件要进行编译才会编译成dll或者exe文件
cmake_minimum_required(VERSION 3.17) project(hello) // 项目名称 set(CMAKE_CXX_STANDARD 14) add_library(hello SHARED top_yumbo_jni_JNIHelloWorld.cpp) //第一个是项目名称,第二个是我们.h修改为.cpp后加了函数实现的文件
2.2 进行编译,build -> build project 即可完成编译。注意这里面因为用到了jni,所以需要确保没有报红信息
package top.yumbo.jni; public class JNIHelloWorld { public static native String hello(); }
package top.yumbo.jni; public class JNIDemo { public static void main(String[] args) { // 1.加载dll文件,如果是System.load()需要加上.dll后缀,下面这个不需要后缀 System.loadLibrary("src/top/yumbo/jni/lib/libhello"); String hello = JNIHelloWorld.hello();// 2.通过jni调用dll函数,得到返回值 System.out.println(hello);// 3.打印返回值 } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)