Windows下Eclipse中免Cygwin的NDK(JNI)配置及Demo调试

这两天由于工作需要用到JNI功能,以前虽然尝试过调试,但最终都以失败而告终。这次是因为工作需要,实在绕不开了,只好耐着性子钻研,最终花了一天多时间才调试成功。在这两天时间里,我可谓是遇到了各种奇葩问题,几乎可以断言,如果你尝试的是免Cygwin交叉编译器的方法配置NDK并调试JNI,那么看了我这篇文章你应该可以解决所有问题了。闲言少叙,进入正题。

首先说明一下我的开发平台:win7+Eclipse32位(Google打包好的带ADT版本的)+ADT 23.0.2版本。

本文探讨的仅仅是JNI技术相关的,所以我假设你的JDK,SDK都已经配置正确。如果没有配置好,请先做好准备工作再回来。

  1. 检查你的ADT是否带有NDK插件选项

这个版本的ADT是不包含NDK管理插件的,意思就是在你的菜单项Window->Preferences->Android下没有NDK这一项。所以首先就要安装NDK管理插件。去这里下载,提取密码: f6zy。这个只是NDK插件,所以本来就不大,只有不到100K。然后把下载的这个jar文件复制Eclipse\plugins文件夹下,重启一下Eclipse,你就会发现在Window->Preferences->Android下出现了NDK选项。其实这就是安装了一个NDK插件。

        2.  现在SDK资源并集成到Eclipse中

刚才只是在Eclipse中安装了NDK插件,现在要下载真正的NDK的资源了,点这里下载,密码: 6gqf。下载之后解压到你想要的文件夹即可,但要注意该文件夹任何一层都不要有空格!压缩率较高,所以解压较慢,耐心等它滚完。解压完之后回到Window->Preferences->Android找到NDK项,在右侧的NDKLocation中填入你的NDK资源解压目录,如我的是“E:\Android\adt-bundle-windows-x86-20140702\adt-bundle-windows-x86-20140702\android-ndk-r10e”,点击OK退出。

从NDK的r7及以上的版本都可以不需要Cygwin交叉编译工具了,所以你从别的地方下载的r7以上的版本也可以。

3.配置环境变量

还一步其实是可有可无的,区别在于后面指定包括的.h文件时采用相对路径还是绝对路径。如果你做了这一步,可以采用相对路径,如果没做,没关系,只需要改成决定路径,一样不会有问题。具体操作很简单,添加一个系统环境变量即可,我的如图

其中变量名随意,值为第2步中的NDK资源的解压路径。配置好了环境变量需要重启Eclipse,新的环境变量才能生效。

好了,到这里我们就把NDK集成到Eclipse中了,下面我们来调试一个小Demo,这里才是最主要的。我是按http://blog.csdn.net/wufangna/article/details/33726913调试的,很详细,我就不再重复了,只说我在调试的过程中遇到的问题及解决办法。

一、首先遇到的问题应该就是“Type 'JNICALL' could not be resolved”等等一大堆的could not be resolved,这是由于这个C++文件需要的.h头文件未被包含进来的缘故,解决办法是选中该工程,在右键弹出的命令中选择Propertie->C/C++ General->Paths and Symbols,如图

在右侧的Includes点Add添加新的包含,如图

里面的值就和上面步骤(3)有关了,如果你做了步骤3,且重启了Eclipse,就可以用先对路径,值为“${NDKROOT}\platforms\android-21\arch-arm\usr\include”;如果你没做步骤3,没关系,改成绝对路径即可,如我的就是“E:\Android\adt-bundle-windows-x86-20140702\adt-bundle-windows-x86-20140702\android-ndk-r10e\platforms\android-21\arch-arm\usr\include”。最后还要选中“Add to all languages”。

二、java.lang.UnsatisfiedLinkError: Native method not found,即找不到本地方法的错误。这是由于jni文件夹下自动生成的是C++文件(后缀名为.cpp),而非C文件(后缀名为.c)。解决方法为打开.cpp文件,在把里面的代码放入ertern"C"{

……

里面的代码放入这里

……

}

#include <jni.h>
extern"C"{
	JNIEXPORT jstring JNICALL Java_dw_ndkwork_MyActivity_stringFromJNI(JNIEnv *env,jobject thiz)
	{
		return env->NewStringUTF("This is myfirst JNI!");
	}
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值