最近在学NDK为以后的可能需要用到的项目做准备。在环境配置遇到的问题总结。在选择网络安装时,都是选择Direct Connection,故而在Choice A Download Site里的可选地址列表为空。纠结了好久,或是自己手动填写地址也是下载不了安装包。之后在一开始选择“USE IE5 Setting”就可以看到地址可选的列表,好高兴了。且选择了地址:http://www.cypwin.cn网址就开始下载数据包了,之后安装安装了好久。OK了。
哈,事实是,我安装了好久的cygwin,但是同事告诉我现在android的eclipse支持window下的环境了,故不需要cygwin了。
工程创建:建立了一个android工程后,右击选择Android Tools -> Add Native Support..确定了即可。
在cmd命令下进入android工程的src目录,(cmd下,如C盘跳入D盘,需要输入:d:和回车即可)输入如下命令:
javah -jni com.zyp.hello.LowerToUpper(com.zyp.hello是包名,LowerToUpper为文件名)
用来生成LowerToUpper.h文件,LowerToUpper.h主要是用来编辑LowerToUpper.c文件,主要是利用LowerToUpper.h文件生成的JNIEXPORT void JNICALL Java_com_zyp_hello_LowerToUpper_convert (JNIEnv *, jobject, jstring, jstring);copy到LowerToUpper.c里的convert函数定义里。
java文件里有:
new LowerToUpper().convert("/sdcard/abc.txt", "/sdcard/result.txt");
用到native的函数。
而LowerToUpper.java的内容是:
package com.zyp.hello;
public class LowerToUpper
{
public native void convert(String filename1, String filename2);
static
{
System.loadLibrary("NDK");
}
}
LowerToUpper.c是实现你要的功能的C/C++语言文件。
遇到的问题(1):在API是1.5除外的API会工程会出现一个红色的叉叉,又找不到错误,后期发现在时出现错误:Android NDK: WARNING: APP_PLATFORM android-14 is larger than android:minSdkVersion 8 .....
百度:
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
將 8 改為 14
问题(2):在.c文件出现错误:
Type 'FILE' could not be resolved
解决:参考:
http://hi.baidu.com/panqijun2006/item/d29e20c53959261251505819。
问题(3):出现logcat的提示信息如下:
07-09 09:25:28.716: A/libc(13962): Fatal signal 11 (SIGSEGV) at 0x0000000c (code=1), thread 13962 (com.demo.jni)
07-09 09:25:30.445: E/Trace(13976): error opening trace file: No such file or directory (2)
07-09 09:25:30.695: D/dalvikvm(13976): Trying to load lib /data/app-lib/com.demo.jni-2/libZypzypT.so 0x40ce5fb0
07-09 09:25:30.706: D/dalvikvm(13976): Added shared lib /data/app-lib/com.demo.jni-2/libZypzypT.so 0x40ce5fb0
07-09 09:25:38.346: D/dalvikvm(14029): No JNI_OnLoad found in /data/app-lib/com.demo.jni-2/libZypzypT.so 0x40cdfe30, skipping init
是在测试实现把文件的小写字母转换为大写,且出现如上问题,并且实践结果没出来。故一直百度“error opening trace file: No such file or directory (2)”或是“No JNI_OnLoad found in /data/app-lib/com.demo.jni-2/libZypzypT.so 0x40cdfe30, skipping init”的问题,都的不得答案。之后感觉是文件的读写权限问题,就在xml文件加上
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
就出现实践要的大写转小写结果。但是还是出现以下logcat调试信息:
07-09 09:15:50.145: E/Trace(13637): error opening trace file: No such file or directory (2)
07-09 09:15:51.065: D/dalvikvm(13637): Trying to load lib /data/app-lib/com.demo.jni-2/libZypzypT.so 0x40ce7d78
07-09 09:15:51.065: D/dalvikvm(13637): Added shared lib /data/app-lib/com.demo.jni-2/libZypzypT.so 0x40ce7d78
07-09 09:15:51.065: D/dalvikvm(13637): No JNI_OnLoad found in /data/app-lib/com.demo.jni-2/libZypzypT.so 0x40ce7d78, skipping init
07-09 09:15:51.306: D/gralloc_goldfish(13637): Emulator without GPU emulation detected.
故error opening trace file: No such file or directory (2)”或是“No JNI_OnLoad found in /data/app-lib/com.demo.jni-2/libZypzypT.so 0x40cdfe30, skipping init”的信息不是个问题,可以忽略。(可惜我调试了好久!哇)
Cygwin的使用:
1.先:
Administrator@GRQ5HJMX1RYV8IR ~
$ cd $NDKROOT
2.就可以进入自己的工程目录JavaWork/HelloJni
Administrator@GRQ5HJMX1RYV8IR /cygdrive/d/android-ndk-r8e
$ cd ../JavaWork/HelloJni
3.开始编译
Administrator@GRQ5HJMX1RYV8IR /cygdrive/d/JavaWork/HelloJni
$ $NDKROOT/ndk-build。