前言
最近在做一个通过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
需要调用的本地方法,即native
EastmzGame.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盘中
- 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();
复制代码
测试结果
如果觉得有帮助,请打赏...(^_^ *** ^_^)