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"{
……
里面的代码放入这里
……
}
首先说明一下我的开发平台: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!"); } }
相关文章推荐
- java形式参数和实际参数
- java多线程二
- Java设计模式--工厂模式
- 使用replaceAll()替换有"+"的字符串出现:java.util.regex.PatternSyntaxException
- (转)Spring读书笔记-----Spring的Bean之Bean的基本概念
- 在Eclipse中使用JUnit4进行单元测试(高级篇)
- Java面向对象 继承类的一些特殊写法
- spring security 11种过滤器介绍
- java中对list集合中的数据按照某一个属性进行分组
- Java JAX-WS和JAX-RS webservice的区别和特点
- 接口测试-自动化-Java实现-TestMain
- myeclipse2015-version-comparison.pdf
- java学习路线
- Java实现获取文件MD5
- Zookeeper 03 Java访问Zookeeper
- springmvc数据验证
- JAVA将反斜杠"\"转成正斜杠"/"
- Maven中maven-source-plugin,maven-javadoc-plugin插件的使用:
- eclipse 创建maven项目设置默认jdk版本
- 使用spring的 scheduled的注解进行定时任务