前言
最近在做一个通过java程序调用c++动态语言库,在网上百度,谷歌找了诸多例子,还是屡试不爽。经过一番折腾还是披荆斩棘,创出一条道路。希望分享给正在迷茫的朋友们...
使用的环境
spring boot + gradle
JNI介绍
JNI全拼是Java Native Interface,中文意思为Java本地调用。JNI标准是Java平台的一部分,它允许java和其他语言的代码进行交互。JNI开始是为了本地已经编译好的语言,尤其是C和C++而设计的,我们也可以使用JNI和其他语言进行沟通,我们只要调用约定受支持了就可以了。
JNI vs JNA

加载流程
使用jni和jna的区别这里便不再多说。这里我使用的是jna的方式。不多说,直接撸代码,首先在依赖文件中加入相关jar包。
compile group: 'com.sun.jna', name: 'jna', version: '3.0.9'
windows环境
-
定义好
java需要调用的本地方法,即nativeEastmzGame.class/** * get game result from third * @return */ public native String getGameResult(); -
生成
.class编译文件在类文件的当前目录执行,这里加入了字符,防止乱码。
javac -encoding utf-8 EastmzGame.java -
生成
.h头文件在
src.main.java目录下执行javah -classpath . -jni com.bsmao.task.jni.EastmzGame -
再由
vc编译工具将.h文件实现并且编译出.dll文件,linux为.so文件。将
.dll文件放入到项目中或者放到e盘中 我这里是放到了resources下面

- java中再调用
.dll文件
static {
try{
String path = ResourceUtils.getURL("classpath:jniLibs/GetData.dll").getPath();
System.load(path);
//System.load("E:/bsmao/dll/MFCLibrary11.dll"); //e盘的绝对地址
}catch (Exception e){
e.printStackTrace();
}
}
-
测试调用结果
这是经过处理过的数据

linux环境
定义本地方法:

本文是指定路劲读取so文件(和so文件生成的文件路径保持一致)

编译.class
生成.h,.c文件

将上面两个文件传入到linux指定文件夹下
/usr/local/bsmao/lib

sudo cc -I /usr/local/bsmao/java/jdk1.8.0_162/include/linux -I /usr/local/bsmao/java/jdk1.8.0_162/include/ -I /usr/local/bsmao/lib/ -fPIC -shared -o libEastmzGame.so com_bsmao_task_jni_EastmzGame.c
生成出so文件

调用方式和windows一样
EastmzGame eastmzGame = new EastmzGame();
byte[] res = eastmzGame.ElevenAgreement();
测试结果

如果觉得有帮助,请打赏...(^_^ *** ^_^)
