Ubuntu 32下Android NDK+NEON的配置過程及簡單使用舉例,androidndk
1、 利用VMware在Windows7 64位下安裝Ubuntu13.10 32位虛擬機器;
2、 從 https://developer.android.com/tools/sdk/ndk/index.html下載android-ndk32-r10-linux-x86.tar.bz2;
3、 將android-ndk32-r10-linux-x86.tar.bz2拷貝到Ubuntu的/home/spring/NEON檔案夾下,並解壓縮;
4、 配置環境變數:在終端輸入 sudovi /etc/profile , 開啟profile檔案,在此檔案最後加上:
export NDKROOT=/home/spring/NEON/android-ndk-r10 (注意:絕對路徑)
export PATH=$NDKROOT:$PATH
5、 儲存profile檔案,重啟Ubuntu;
6、 輸入 echo $PATH,會有/home/spring/NEON/android-ndk-r10 ;
7、 輸入 ndk-build,顯示AndroidNDK 等相關資訊,說明配置NDK成功;
8、 安裝arm-linux-gcc(基於arm架構的linux平台交叉編譯工具):從http://www.arm9.net/download.asp 下載arm-linux-gcc-4.4.3-20100728.tar.gz;
9、 將arm-linux-gcc-4.4.3-20100728.tar.gz拷貝到Ubuntu的/home/spring/NEON檔案夾下,並解壓縮;tarxvzf arm-linux-gcc-4.4.3-20100728.tar.gz
10、 配置環境變數:在終端輸入 sudo vi /etc/profile , 開啟profile檔案, 在此檔案最後加上:exportPATH=$PATH:/home/spring/NEON/opt/FriendlyARM/toolschain/4.4.3/bin ,儲存profile;
11、 重啟Ubuntu,在終端輸入 arm-linum-gcc -v ,如果顯示gcc version 4.4.3等相關資訊,說明配置成功。
範例程式碼(http://hilbert-space.de/?p=22) test.cpp:
void reference_convert (uint8_t * __restrict dest, uint8_t * __restrict src, int n){ int i; for (i=0; i<n; i++) { int r = *src++; // load red int g = *src++; // load green int b = *src++; // load blue // build weighted average: int y = (r*77)+(g*151)+(b*28); // undo the scale by 256 and write to memory: *dest++ = (y>>8); }}void neon_convert (uint8_t * __restrict dest, uint8_t * __restrict src, int n){ int i; uint8x8_t rfac = vdup_n_u8 (77); uint8x8_t gfac = vdup_n_u8 (151); uint8x8_t bfac = vdup_n_u8 (28); n/=8; for (i=0; i<n; i++) { uint16x8_t temp; uint8x8x3_t rgb = vld3_u8 (src); uint8x8_t result; temp = vmull_u8 (rgb.val[0], rfac); temp = vmlal_u8 (temp,rgb.val[1], gfac); temp = vmlal_u8 (temp,rgb.val[2], bfac); result = vshrn_n_u16 (temp, 8); vst1_u8 (dest, result); src += 8*3; dest += 8; }}
12、執行命令: arm-linux-gcc –g –c –Os –fPIC–mfloat-abi=softfp –mfpu=neon test.cpp
ar –r libtest[android].a *.o 成功產生libtest[android].a靜態庫。
還有另外一種方法,就是無需安裝arm-linux-gcc,直接用Android-NDK即可,操作步驟如下:
1、 接著以上第7步;
2、 添加環境變數:在終端輸入 sudovi /etc/profile , 開啟profile檔案,在此檔案最後加上:
export NDKBIN=/home/spring/NEON/android-ndk-r10/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86/bin(注意:絕對路徑)
export PATH=$NDKBIN:$PATH
3、 儲存profile檔案,重啟Ubuntu;
4、 輸入echo $PATH, 會有/home/spring/NEON/android-ndk-r10/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86/bin
5、 編譯test.cpp代碼: arm-linux-androideabi-gcc -I/home/spring/NEON/android-ndk-r10/platforms/android-9/arch-arm/usr/include-c -Os –mfloat-abi=softfp –mfpu=neon test.cpp
ar –r libtest[android].a *.o 成功產生libtest[android].a靜態庫。
android android-ndk-r4-windows 配置
怎在Android中使用組合語言
我這邊使用的是最新的Android4.0的開發工具,NDK也是最新支援4.0的。這個NDK與老版本的有一些比較明顯的不同。由於我用的是Mac OS X,因此配置起來比瘟抖死上的要容易許多,你不需要再裝些雜七雜八的第三方工具,直接可以使用你下載好的NDK。首先,設定目標路徑——在你的Terminal中進入NDK的根目錄,隨後打NDK_PROJECT_PATH="<你要編譯的項目路徑>"。斷行符號,再輸入export NDK_PROJECT_PATH斷行符號。這裡要注意的是NDK_PROJECT_PATH=後面的路徑需要加引號,否則無效。由於NDK預設支援的預設編譯選項僅支援ARMv5到ARMv5TE架構,因此如果要使用比較進階的特性的話有兩種方法:1、你有辦法將TARGET_ARCH_ABI的值變為armeabi-v7a,俺自己試了一下,木有成功。因此可以使用第二種方法,更簡單便捷:2、在你的NDK目錄下,找到toolchains,然後找到arm-linux-androideabi-x.y.z目錄,在進去可以發現setup.mk檔案。找到-march=armv7-a,將上面的神馬#ifdef都去掉,下面的#endif也都刪了。這樣就能確保編譯器使用ARMv7A來編譯。完成上述操作之後我們就可以先用最簡單的方式來寫彙編了,即內聯彙編——static int my_thumb(int dummy) { __asm__("movw r0, #1001 \t\n" "movw r12, #2020 \t\n" "add r0, r0, r12 \t\n" "bx lr"); return dummy; } jstring Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env, jobject thiz ) { my_thumb(0); return (*env)->NewStringUTF(env, "Hello from JNI !"); } 上述代碼其實就是基於NDK內建的hello-jni項目修改的。最後用ndk-build可以成功編譯。上面一段代碼是編譯器預設的使用Thumb/Thumb-2編譯的,因此我裡面寫的內聯彙編的指令都是Thumb代碼。我們下面將講述一下如何使用ARM代碼並使用NEON指令集。首先,在你的Android.mk中修改LOCAL_SRC_FILES,要將源檔案名稱後面添加.neon尾碼,比如LOCAL_SRC_FILES := hello-jni.c改成LOCAL_SRC_FILES := hello-jni.c.neon。這裡要注意的是你真正的源檔案名稱不要修改,就修改LOCAL_SRC_FILES這個符號的值即可。然後我們再添加新的變數,來指示ARM GCC使用ARM指令集來編譯——LOCAL_ARM_MODE := arm這樣就OK了。我們修改一下代碼:static int my_arm(int dummy) { __asm__("movw r0, #1001 \t\n" "movw r12, #2020 \t\n" "add r0, r0, r12 \t\n" &......餘下全文>>