最近项目需要,将C++的算法工程编译成动态链接库,交给 Java后台当作函数库调用。就去了解了下Jni。使用起来还是比较方便的。
1. 首先编写Java的调用类。例如:
public class TestJni(){ static{ System.loadLibrary("TestJinDll"); //这个名字随便起,跟C++生成的DLL对应就行 } public static native String callFun(String paramStr); //具体的调用方法。 }
2. 导出这个类的.h文件,也就是头文件。可以用命令行生成也可以通过IDEA编辑个工具,这样以后修改直接生成就可以了。就是这样:
使用的时候就 文件上右键--> external tools-->javah.就可以了。这时就生成了一个头文件。类似于这样⬇️:
这里边的东西不要改。
3. 建立一个C++工程。选动态链接库类型的。将这个头文件复制过去 。同时还有 两个头文件分别是jni.h和jni_md.h,这两个文件在jdk安装目录下include文件下和include/win32下,全部 复制到C++工程。然后就是实现了,将头文件中的方法声明原封不动的copy到源文件 中去实现就可以了。然后就可以生成动态 链接库了 。
参数的类型jstring,只是Java到C++的中间类型。其他的类型也都可以。我这里传个json串过去,在C++中解析成类就好了 。
json串的解析可以使用 rapidjson。 github大神封装的AIGCJson很好用,传送门。
4. 生成的链接库复制到Java工程的根目录下。调用就好了。 String res = TestJni.callFun(param);