一、jni环境的搭建
JNI(Java native interface): java和其他语言(C&C++)进行交互的一种接口编码规则。
NDK(Native Development Kit):将其他语言(C&C++)编译成库供Java层调用的开发工具包。
①下载ndk的包
可以去谷歌下载,我的是win10的系统,
在这里提供android-ndk-r22-windows-x86_64的包
链接:https://pan.baidu.com/s/1CKXFLuaokiQIysb9H-lgOA 提取码:23so 复制这段内容后打开百度网盘手机App,操作更方便哦
②将包解压后的路径加入系统环境path中,包不要存的太深,避免路径找不到
我的路径是:F:\workpath\ndk-samples-android-mk
③验证是否安装成功
打开cmd,输入ndk-build,出现以下内容,则成功
(eclipse的环境配置差不多,也是将jdk的bin目录和jdk下的jre的bin目录加入系统环境变量path中)
二、Java调用c++ dll库的方法
我也是新接触这个,所以参考了*博主:地表最强菜鸡*的一篇博客,使用了其中的代码
博客链接:
这里详细说一下如何使用java指令生成.h头文件
A 环境配置好后,进入创建好的项目的src目录中(假如有包路径,也要进入包路径直到有创建的.java文件出现)
我的路径为:F:\workspaces\ServerPackage\helloworld\src\com\test\jni
B 在此目录打开cmd,输入javac -h ./ 类名.class, 对应的头文件会生成在这个类路径中
一定要是类的全路径,否则会失败,这个指令是jdk8以上的才能使用,假如不是,则可以尝试使用 javah -classpath jni 类的全路径.java
这里也详细说明一下如何使用VStudio生成dll文件
① 创建项目,我用的是VS2019
选择具有导出项的dll,没有找到的话可能是没有下载这部分插件,去VS installer里面下载就行,VS installer是下载vs会自带的 ,项目名最好为JavaCallcpp,因为导入到java里面的时候是以这个为识别名,避免报错
② 导入jni.h、jni_md.h和指令生成的.h头文件并且设置相应的路径
jni.h在jdk的include下,我的路径为E:\java\jdk1.8.0_221\include
jni_md.h在jdk的include的win32目录下,我的路径为E:\java\jdk1.8.0_221\include\win32
指令生成的头文件就在指令运行的那个文件目录下,我的路径为F:\workspaces\ServerPackage\helloworld\src\com\test\jni
将以上三个路径设置到项目中,操作如下:
1 项目上右击,选择属性
2 选择VC++目录后,将三个路径配置到包含目录中
3 保存
需要注意的是:我是64bit的jdk所以我在配置之前还修改了管理器
1 解决方案上右击,选择配置管理器
2 选择x64位
③ 将代码写完后,右击项目生成,会有dll文件生成,在项目目录下的debug文件夹下有个项目名.dll文件就是生成成功啦!
注意下面这个图片,我的路径是含有x64的,没有修改配置器的话,则直接在Debug目录下就能找到
接下来就是把.dll文件导入到jre当中
又有个注意的是:假如是eclipse 2020版本的,一定要注意自己的jre路径在哪,有个最最最不要动脑子的简单的确认方法就是,先复制.dll文件进你觉得是对的的jrd路径的bin里面,然后运行Java代码,假如报错就会有路径显示出来,告诉你哪哪哪没找到JAVACALLCPP.dll文件,你复制这个去目录里面找到就行,然后把.dll文件再放进去
我的路径是C:\Users\lenovo\.p2\pool\plugins\org.eclipse.justj.openjdk.hotspot.jre.full.win32.x86_64_15.0.2.v20210201-0955\jre\bin
三、可能会遇见的报错
Can't load IA 32-bit .dll on a AMD 64-bit platform at java.base/jdk.internal.loader.NativeLibraries.load(Native Method) ...
- 在使用vs生成时右击项目点击管理配置器修改为x64,生成就会为64位的dll
前面一串地址:not to found dll (这个报错的后面一串英文可能写错了,但是大概意思是这样,我给忘了全部的)
- dll文件粘贴错了位置,根据报错信息里面的一串地址去找到相对应的地方,重新复制进去,记得把之前导错的dll文件删除,没别的,就是我觉得有个多余的文件有点心烦哈哈哈哈
感觉比较主要的就这两个错误,大家看到console飙红色不要害怕,把报错信息看清楚,再去耐心的找答案,而且不一定一开始找到的参考答案就是对的,配置不一样,解决方法不一样,所以一定要有耐心,嘻嘻嘻(话说得好听,我改得时候也是一边威胁我的电脑一边查资料)
最后的最后,假如你有什么其他的不懂得的地方我们可以一起交流~~~,以上就是完整的java调用c++接口啦!