Ubuntu 32下Android NDK+NEON的配置過程及簡單使用舉例,androidndk

來源:互聯網
上載者:User

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" &......餘下全文>>
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.