基于jni库Java调用C++的DLL的说明文档
参照网上资料,我们以一个简单的事例讲述如何在window或者linux环境下,Java代码如何调用C++。本文档只测试了window下Java调用DLL是正确的,linux下的so并未验证,但是据资料说用同样的方法即可,不需要区分dll和so。
项目背景
现在有文件setNum.cpp文件,如下:
1 | int i = 0; |
那我们如何用java去用set和get方法呢?下面我们来解决这个问题吧。
Java调用C++的方法
概括来说,我们需要做几件事:java采用jni对dll进行引用;基于jni,按照java新生成的.h文件重写编写cpp,并生成相应的新的dll。下面将结合代码详细讲述
1.基于jni,java对已有的dll引用
假设已有有setNum.cpp生成的dll,名为goodluck.dll,我们写testdll.java文件,如下,包括引用dll文件,以及用native定义setNum.cpp内部的方法。
1 | public class testdll |
2.生成基于jni的新代码
1 | javac testdll.java //此处生成class文件 |
我们看一下testdll.h代码,请注意里面的文字解说。
1 | /* DO NOT EDIT THIS FILE - it is machine generated */ |
3.C/C++重写方法
按照testdll.h文件中的方法命名方式,重写testdll.cpp文件,如下:
1 | #include "StdAfx.h" |
4.重新生成dll
我是用VC++生成的dll,我想工具是很多的,思路到了就可以啦~。
我在VC++新建了一个win32 Dynamic-Link Library简单的项目,也就是DLL项目,命名为goodluck(很明显抄袭人家,想上面网络资料的作者致谢!)。
将testdll.cpp里面的代码内容覆盖goodluck.cpp,这时候变异运行即可生成dll文件。
但是会出现一些问题,由于jni可能没引入,编译不过去。所以请将下图中jdk的include中的三个文件放在vc++相应的include文件下,在编译即可。
5.运行java文件
最后我们将goodluck项目中生成的goodluck.dll放在与testdll.java同级文件夹下即可。
我们运行一下testdll.java文件
java testdll