【参考链接】

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方法

NDK[0]jni

 

在工程src目录下,执行javah com.shadowfaxghh.test.Test,来得到.h头文件

如果提示” 编码GBK的不可映射字符”,则可以加上-encoding utf-8 选项

NDK[0]jni

会在src目录下生成com_shadowfaxghh_test_Test.h文件,内容如下,其中有native方法的方法声明

NDK[0]jni

可以看到引用了jni.h

其中的JNIEnv、jstring、jobject等类型其实都是在jni.h中定义的

 

接下来在VisualStudio中新建一个项目,选择Win32控制台应用程序,项目取名CJniDemo

NDK[0]jni

设置如下

NDK[0]jni

项目创建完成以后,将.h文件剪切到VisualStudio项目文件夹中,并添加到源文件中

NDK[0]jni

目前自动编译会报错,因为找不到引用的jni.h等头文件,需要添加include

在“属性管理器”页卡下,打开属性设置,添加如下的JDK中的两个目录

NDK[0]jni

确定以后可以看到.h已经不报错了

回到“解决方案资源管理器”页卡,开始编写实现,新建一个test.cpp文件,代码如下

NDK[0]jni

可能会注意到,这个env->NewStringUTF()的调用方式跟后续NDK中的不同

这是因为jni.h中会根据是否启用了C++而进行不同的宏定义,导致JNIEnv的类型不同

这个对使用没有什么影响,所以不用纠结

NDK[0]jni

 

接下来准备编译cpp,因为想要生成64位的dll,所以还要进行一下设置

仍然是在“属性管理器”页卡下,打开属性设置,如下操作点击新建,选择平台x64

NDK[0]jni

NDK[0]jni

 

进行编译,在菜单栏中选择buid->build或者生成->重新生成解决方案,生成dll文件

NDK[0]jni

 

接下来要使用这个dll文件

回到Eclipse中,需要先把这个dll文件添加到项目的BuildPath中

在上面新建的项目右键Properties,选择Java Build Path,点开JRE System Library,选中Native library location,Edit设置到dll的目录(我这里把上面的dll文件拷贝到了D:\dll目录下)

NDK[0]jni

 

然后开始在代码中进行调用,新增一个Main.java,调用Test中的native方法,代码如下

loadLibrary的参数为dll文件名

NDK[0]jni

执行输出如下

NDK[0]jni

 

此外我执行的时候出现异常

UnsatisfiedLinkError:D:\dll\CJniDemo.dll: Can't find dependent libraries

百度后解决方案如下

使用DLL依赖性分析工具Dependency Walker分析CJniDemo.dll依赖的其他dll

发现依赖的MSVCR100D.DLL在C:\Windows\System32中不存在

下载一个放进去以后执行正常

可能跟我安装VisualStudio的时候出的有问题有关系

 

 


相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-01-23
  • 2021-04-07
  • 2022-01-08
  • 2021-10-09
  • 2021-11-07
  • 2021-07-26
猜你喜欢
  • 2022-02-17
  • 2021-12-08
  • 2021-08-14
  • 2022-12-23
  • 2021-07-31
  • 2021-09-20
  • 2021-07-03
相关资源
相似解决方案