1.起因
最近要和服务端对接一些功能,需要将一些C++开发的功能对接给服务端接入,但是他们服务端开发用的是java,所以才有了这个问题:如何使用Java调用C++?问题的答案就是:使用jni做一层java到C++的数据格式转换,然后用java调用C++。
2.方法
2.0 配置java环境
- (1) 安装 jdk-8u361-windows-x64.exe
- (2) 配置环境变量
>> JAVA_HOME=D:\software\Java\jdk1.8.0_361
>> CLASSPATH=.;%JAVA_HOME%\bin;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
- (3) 添加如下环境变量到path变量中:
>> %JAVA_HOME%\bin
>> %JAVA_HOME%\jre\bin
2.1 环境搭建
这里需要安装两个工具:jdk和mingw
jdk安装成功标准:
(1) java命令正常使用:cmd中输入java,运行
(2) javac命令正常使用:cmd中输入javac,运行:
mingw安装成功标志:
(1) gcc正常使用:输入gcc -v
(2) g++正常使用:输入g++ -v
2.2 写一个java程序:NativeTrait.java
public class NativeTrait {
public native static int isMarkOK(String filename);
static {
System.load("E:/Code/jni/MarkAR/libMarkAR.dll");
}
public static void main(String[] args) {
NativeTrait trait = new NativeTrait();
String filename = "E:/data/zq/miguqingfeng.jpg";
int ret = trait.isMarkOK(filename);
System.out.println(ret);
}
}
2.3 编译java程序,生成.class文件
>> javac NativeTrait.java
2.4 生成对应头文件:NativeTrait.h
>> javah NativeTrait
2.5 新建NativeTrait.cc实现对应方法
#include "NativeTrait.h"
#include <string>
#include <iostream>
JNIEXPORT jint JNICALL Java_NativeTrait_isMarkOK(JNIEnv *env, jclass obj, jstring path_) {
std::string path = std::string(env->GetStringUTFChars(path_, 0));
std::cout << "Input path is: " << path << std::endl;
return 0;
}
2.6 编译生成dll库
>> g++ -Wl,--add-stdcall-alias -shared -o libMarkAR.dll NativeTrait.cc
2.7 测试效果
>> java NativeTrait
3.参考资料
[1] https://blog.youkuaiyun.com/dashu_java/article/details/119326520
[2] https://blog.youkuaiyun.com/azure_sky_2014/article/details/71915605