當前位置:商標查詢大全網 - 教育培訓 - 如何在Android中使用匯編語言

如何在Android中使用匯編語言

因為Android環境很復雜,框架都是Java,使用C/C++需要大量的配置,使用匯編需要更多的工作。

我用的是Android4.0的最新開發工具,NDK是最新支持4.0的。這個NDK和舊版本有壹些明顯的不同。

因為我用的是Mac OS X,它比個人電腦上的配置要容易得多。妳不需要安裝任何雜項第三方工具,所以妳可以直接使用妳下載的NDK。

首先,設置目標路徑——在妳的終端中輸入NDK的根目錄,然後鍵入NDK _項目_路徑= " "。輸入並輸入導出NDK項目路徑。

進入汽車。

這裏註意,NDK _項目_路徑=後面的路徑需要引號,否則無效。

由於默認情況下NDK支持的默認編譯選項僅支持ARMv5至ARMv5TE架構,因此有兩種方法可以使用更高級的功能:

1,妳有辦法把TARGET_ARCH_ABI的值改成armeabi-v7a。我自己試過,但是沒用。所以可以用第二種方法,更簡單方便:

2.在您的NDK目錄中,找到toolchains,然後找到ARM-Linux-Android ABI-x.y.z目錄,在那裏您可以找到setup.mk文件。Find -march=armv7-a,去掉上面所有的#ifdef和下面的#endif。這樣可以確保編譯器使用ARMv7A進行編譯。

完成上述操作後,我們就可以用最簡單的方式編寫程序集了,即內聯匯編-

靜態int my_thumb(int dummy)

{

__asm__("movw r0,#1001 \t\n "

movw r12,#2020 \t\n

添加r0,r0,r12 \t\n

" bx lr ");

返回虛擬對象;

}

jstring

Java _ com _ example _ hello JNI _ hello JNI _ stringFromJNI(JNIEnv * env,

jobject thiz)

{

my _ thumb(0);

return(* env)-& gt;NewStringUTF(env,“妳好,來自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。

沒關系。讓我們修改代碼:

靜態int my_arm(int dummy)

{

__asm__("movw r0,#1001 \t\n "

movw r12,#2020 \t\n

添加r0,r0,r12 \t\n

vdup.32 q0,r0 \t\n

" bx lr ");

返回虛擬對象;

}

jstring

Java _ com _ example _ hello JNI _ hello JNI _ stringFromJNI(JNIEnv * env,

jobject thiz)

{

my _ arm(0);

return(* env)-& gt;NewStringUTF(env,“妳好,來自JNI!”);

}

使用ndk-build後,可以正常通過編譯。

最後去頂頂。直接編寫程序集文件。NDK有氣體工具,所以編寫匯編文件是合理的。通常,程序集文件的後綴是。所以我們可以創建壹個xxx.s文件。

然後我在這裏創造了壹個名字叫hey.s。在Android.mk中添加這個文件:local _ src _ files+= hey.s.neon。

我們在這裏看到,為了在匯編文件中使用NEON指令集,我們還添加了。霓虹後綴在這裏。匯編程序的Makefile也能識別這個標誌。

我們編輯hey.s文件:

。文本

。對齊4

。手臂

。環球我的真實手臂

我的真實手臂:

添加r0,r0,#256

vmov q0,q1

vdup.32 q0,r0

bx lr

這裏需要註意的是,在蘋果的匯編程序中,函數名要有前綴和下劃線,而NDK提供的匯編程序沒有。

讓我們修改hello-jni.c並把這個函數放入:

extern void my _ real _ arm(int I);

靜態int my_arm(int dummy)

{

__asm__("movw r0,#1001 \t\n "

movw r12,#2020 \t\n

添加r0,r0,r12 \t\n

vdup.32 q0,r0 \t\n

" bx lr ");

返回虛擬對象;

}

jstring

Java _ com _ example _ hello JNI _ hello JNI _ stringFromJNI(JNIEnv * env,

jobject thiz)

{

my _ real _ arm(0);

my _ arm(0);

return(* env)-& gt;NewStringUTF(env,“妳好,來自JNI!”);

}

當然,為了保證編譯器能夠正確混合ARM和Thumb指令集,我們可以在剛才setup.mk中的TARGET_CFLAGS標誌中強制添加-mthumb-interwork。

在Windows操作系統中測試後,最終發現只要去掉Application.mk中APP_ABI中的標誌,只留下armeabi-V7A,就可以流暢使用neon。這樣就不需要修改setup.mk,也不需要去掉Sample中的標誌判斷,非常方便。

以下是可用的Android.mk編譯配置文件列表:

LOCAL_PATH := $(調用my-dir)

包括美元(VARS結算)

LOCAL_MODULE := HelloNeon

LOCAL_SRC_FILES := helloneon.c

本地_ ARM _模式:= arm

TARGET _ CFLAGS+=-m thumb-interwork

TARGET _ CFLAGS+=-STD = GNU 11

TARGET_CFLAGS += -O3

ifeq ($(目標_拱門_ABI),armeabi-v7a)

LOCAL _ CFLAGS:=-d have _ NEON = 1

LOCAL _ SRC _ FILES+= neontest . s . neon

LOCAL_ARM_NEON := true

endif

LOCAL_LDLIBS := -llog

包含$(BUILD_SHARED_LIBRARY)

$(調用導入模塊,CPU功能)

當使用jni時,您只需要將JNI文件夾添加到您當前的項目目錄中,然後按照示例中提供的文件布局進行操作。用ndk-build編譯時(Windows下cygwin控制臺使用ndk-build.cmd),如果構建成功,在libs文件夾中會生成壹個libXXX.so。然後用Eclipse ADT重新打開您的項目,您會發現jni文件目錄和生成的so文件會顯示在您的項目文件目錄中。當然,您也可以編輯。的匯編文件直接放在Eclipse IDE下,這樣更容易閱讀。

最後,如果妳想在Android匯編程序中註釋壹個語句,妳必須在C89/90-/*中使用註釋字符...*/

C++98後面引入的分號和//形式都沒用。

在最新的NDK版本android-ndk-r8d中,加入了ARM-Linux GCC4.7和目前流行的LLVM Clang3.1。但是LLVM Clang3.1的很多編譯選項與GCC不同,所以使用Clang3.1時需要自己配置相應的編譯選項。這個版本的NDK的默認編譯器工具鏈是GCC 4.6版。如果要使用GCC4.7,可以在Application.mk文件中添加NDK _工具鏈_版本= 4.7;如果要使用Clang3.1,可以在Application.mk中添加ndk _ toolkit _ version = clang 3.1以下是壹個合法的Application.mk的內容:

#用LLVM構建Clang3.1

# NDK _工具鏈_版本= 3.1

#使用ARM-Linux GCC4.7構建

NDK工具鏈版本=4.7

#只構建ARMv7-A機器碼。

APP_ABI := armeabi-v7a

參考上面的Douding.com。

南京寶雲安卓培訓班正在火熱報名中~