NDK[0]jni

【参考链接】

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的时候出的有问题有关系

 

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值