您的位置:首页 > 编程语言 > Java开发

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

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

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

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

检查你的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!");
	}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: