我用的是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。
南京寶雲安卓培訓班正在火熱報名中~