【参考链接】
Windows下使用Java Jni调用C/C++初探http://blog.csdn.net/pxhero2012/article/details/52926082
JNI的作用是在Java代码中调用C/C++代码编写的动态库。
在Windows系统上,C/C++动态库的格式是.dll,在Linux/Android等系统上,C/C++动态库的格式是.so。
本文以Windows系统下的Java代码调用C/C++动态库.dll为例。
后续ndk则是Linux/Android系统下的Java代码调用C/C++动态库.so。
进行jni开发,本质就是借助于SDK(JavaSDK或Android NDK)中提供的头文件和库文件
比较重要的一个头文件就是jni.h。
本文使用的软件JDK、VisualStudio2010均为64位。
首先在Eclipse中新建一个Java工程,其中Test类中有一个native方法
在工程src目录下,执行javah com.shadowfaxghh.test.Test,来得到.h头文件
如果提示” 编码GBK的不可映射字符”,则可以加上-encoding utf-8 选项
会在src目录下生成com_shadowfaxghh_test_Test.h文件,内容如下,其中有native方法的方法声明
可以看到引用了jni.h
其中的JNIEnv、jstring、jobject等类型其实都是在jni.h中定义的
接下来在VisualStudio中新建一个项目,选择Win32控制台应用程序,项目取名CJniDemo
设置如下
项目创建完成以后,将.h文件剪切到VisualStudio项目文件夹中,并添加到源文件中
目前自动编译会报错,因为找不到引用的jni.h等头文件,需要添加include
在“属性管理器”页卡下,打开属性设置,添加如下的JDK中的两个目录
确定以后可以看到.h已经不报错了
回到“解决方案资源管理器”页卡,开始编写实现,新建一个test.cpp文件,代码如下
可能会注意到,这个env->NewStringUTF()的调用方式跟后续NDK中的不同
这是因为jni.h中会根据是否启用了C++而进行不同的宏定义,导致JNIEnv的类型不同
这个对使用没有什么影响,所以不用纠结
接下来准备编译cpp,因为想要生成64位的dll,所以还要进行一下设置
仍然是在“属性管理器”页卡下,打开属性设置,如下操作点击新建,选择平台x64
进行编译,在菜单栏中选择buid->build或者生成->重新生成解决方案,生成dll文件
接下来要使用这个dll文件
回到Eclipse中,需要先把这个dll文件添加到项目的BuildPath中
在上面新建的项目右键Properties,选择Java Build Path,点开JRE System Library,选中Native library location,Edit设置到dll的目录(我这里把上面的dll文件拷贝到了D:\dll目录下)
然后开始在代码中进行调用,新增一个Main.java,调用Test中的native方法,代码如下
loadLibrary的参数为dll文件名
执行输出如下
此外我执行的时候出现异常
UnsatisfiedLinkError:D:\dll\CJniDemo.dll: Can't find dependent libraries
百度后解决方案如下
使用DLL依赖性分析工具Dependency Walker分析CJniDemo.dll依赖的其他dll
发现依赖的MSVCR100D.DLL在C:\Windows\System32中不存在
下载一个放进去以后执行正常
可能跟我安装VisualStudio的时候出的有问题有关系