17年写过一次jni操作一直给认识的小伙伴说怎么怎么操作 最近发现又有人问起 到处发pdf给他们 发现有点麻烦现在就干脆放在网上大家看
javaJNI使用和DLL动态链接库的使用,和lib静态链接库的使用
CDT:下载地址:http://www.eclipse.org/cdt/downloads.php
MinGw:下载地址:http://download.youkuaiyun.com/download/piano7heart/3651248
这里我推荐绿色版的MinGw 所谓的绿色版就是别人下载好的包
因为我们是使用MinGw来编写C/C++的代码 也就是gcc
选择确定之后将会出现如下界面,因为不是网络版我们可以选择全部安装也可以只安装CDT的C++组件 这里我选择全部安装勾上之后:等待安装完成
9.0以上的版本跟8.0版本的不一样新建C++项目的时候一定要注意
安装9.0的版本新建的时候可能出现如下界面这个时候把下面的那个勾取消掉
选择创建一个HelloWorldC++ 项目 使用的编译器选择MinGw GCC 因为我们安装的就是MinGw然后随便取个名字这里我叫TestCdt
这个时候不是完整的项目我们需要编译注意:每次写完想要执行都需要编译选中我们的TestCdt
这里是完整的工程Debug文件夹里面将会有一个exe结尾的可执行文件,控制台显示的是gcc 编译cpp的命令 提醒一下在CDT里面 cpp的编译文件是.o结尾的 相当于 java的.class文件
注意使用JNI接口必须创建native 接口然后我们需要根据这个接口生成C++的头文件.h文件
这里我们使用java的一个命令 javah -JNI这个命令
JNIEXPORT 这句话是必须要加的,因为我们是jdk自动生成的这个我们就不需要自己操作了
意思就是我们的这个函数是要给JNI使用的, 在上面有extern “C”意思就是可以给C使用
我们的这个头文件引入了jni.h这个头文件很明显,这个是使用JNI来实现 跨平台调用的
我们需要在cpp中实现这个函数这里我就简单打印 我的第一个JNI工程
复制该文件 到你的jdk/bin 路径下 和 jdk/jre/bin 路径下这俩个路径都要放置
复制sdtapi.dll sdtapi.h savephoto.dll dewlt.dll
然后引入DLL依赖 在Cpp里面引入链接库 跟java的区别是java是jar文件 CPP是lib文件
输入依赖的lib的名称点击ok大小写不分但是建议你填的的时候区分开来,记住不要带后缀
然后点击下面的路径这里是寻找lib的路径在什么位置,因为我们已经把lib复制进入我们的工程了,所以我们直接
选择我们的工程我们是复制在Debug这个文件夹下面的直接选择
**********************************************************
很多时候可能遇到的接口情况是 我们可能说没有什么lib库的提供,意思就是说可能别人提供的文件只有.h 和DLL连个文档都没有这个时候我们该怎么办
这个时候我们就需要一个东西 类似java JNI调用DLL一样的东西 我们将通过CPP获取DLL句柄
这里我就直接帖代码 前面已经说了JNI如何使用我就在这里 不废话了
现在我们要直接使用DLL 复制DLL 只需要DLL就行了 其他的都不需要 包括头
这里我引用了 windows.h的头文件也就是说 我这里使用了win32的接口来实现操作 ,然后按照流程引用JNI的接口
我们通过LoadLibray();这个函数 获取DLL句柄 这个函数接收的是DLL路径 这里我直接放在项目Debug目录下 所以可以直接引用 这个函数返回的是句柄 HINSTANCE 返回的错误结果是 NULL 注意 ,cpp里面没有null只有NULL 获取句柄之后我们需要干什么, 我们需要声明,声明实现函数,这个实现函数就是DLL里面的函数接口 这里我们实现一个函数
typedef int (*InitComm)(int port); 声明函数指针 InitComm 我们要通过句柄获取函数
initComm=(InitComm)GetProcAddress(hInstLibrary,"InitComm");
这里 返回的结果也是是否非空 返回 NULL就说明没有获取到当前函数 这个GetProcAddress函数 就是获取函数接口 通过句柄 指针函数名获取指定函数 然后获取之后我们就可以使用这个函数
然后写完之后我们测试这个JNI函数.生成JniDLL.dll