最近在學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。