Compile a native C Android application
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
http://www.cnblogs.com/GoAhead/p/4186707.html
通過(guò)上網(wǎng)搜索,你可以發(fā)現(xiàn)很多種編譯Android native應(yīng)用的方法.我想說(shuō)的是,不同的控制臺(tái)應(yīng)用, 守護(hù)程序(daemon), C/C++庫(kù),等等.這些程序在你自己的計(jì)算機(jī)上
編譯沒(méi)有任何問(wèn)題.
為了給Android編譯程序,你需要ARM工具鏈(toolchain). 我發(fā)現(xiàn)有兩種主張,分別是使用Android Prebuild toolchain和CodeSourcery
1)Android Prebuild toolchain
Android沒(méi)有使用傳統(tǒng)的libc庫(kù).相反,它用了Bionic庫(kù),一個(gè)由Google開(kāi)發(fā)的,用在Android移動(dòng)軟件平臺(tái)上的輕量級(jí)的libc
Bionic被裁剪到只支持 Android系統(tǒng). 請(qǐng)看?六百萬(wàn)美元的c程序庫(kù)
2)CodeSourcery
CodeSourcery是ARM的合作伙伴. 專(zhuān)門(mén)為ARM處理器開(kāi)發(fā)增強(qiáng)GUN工具鏈的,并提供驗(yàn)證過(guò)的GNU工具鏈.這些工具鏈有很多不同的版本.
對(duì)于Android平臺(tái),需要 arm-none-linux-gnueabi, 而 arm-none-eabi是沒(méi)有g(shù)libc包含在里面的,主要面向那些編譯完整的native庫(kù)和應(yīng)用(比如FreeRTOS)
譯者注: arm-none-eabi就是用來(lái)編譯裸機(jī)程序的,請(qǐng)參考?最簡(jiǎn)單的ARM裸機(jī)程序
我個(gè)人的觀點(diǎn),如果白手起家開(kāi)始創(chuàng)建一個(gè)Android的應(yīng)用程序,你應(yīng)該選擇Bionic.
但是如果你選擇從你的PC環(huán)境移植一個(gè)庫(kù)到Android,你應(yīng)該選擇CodeSourcery
如果你使用到線程或者C++異常,Bionic庫(kù)也不能完全支持它們(實(shí)際上,它根本就不支持異常)
agcc.pl是Andrew Ross開(kāi)發(fā)的一個(gè)腳本,讓你以一種很簡(jiǎn)單的方法來(lái)自動(dòng)包含常用的庫(kù),使用Android的ARM工具鏈gcc
某種程度上,他像makefile
第1種方法 使用Makefile和Android NDK
AR?=?arm-linux-androideabi-ar AS?=?arm-linux-androideabi-as CC?=?arm-linux-androideabi-gcc CXX?=?arm-linux-androideabi-g++ LD?=?arm-linux-androideabi-ld.goldNDK_KIT?=?/home/tim/android-ndk-r10b PLATF_KIT?=?platforms/android-9ARM_INC?=?$(NDK_KIT)/$(PLATF_KIT)/arch-arm/usr/include ARM_LIB?=?$(NDK_KIT)/$(PLATF_KIT)/arch-arm/usr/libOBJS?=?hello.o EXES?=?hellohello?:??hello.o$(LD)?--dynamic-linker=/system/bin/linker?-nostdlib?\-rpath-link=$(ARM_LIB)?\$(ARM_LIB)/crtbegin_dynamic.o?\-L$(ARM_LIB)??-lc?\-o?hello?hello.ohello.o:?hello.c$(CC)?-I?$(ARM_INC)?-c?hello.cclean:rm?-f?$(OBJS)?$(EXES)源代碼
#include?<stdio.h>int?main(int?argc,?char*?argv[]) {printf("Hello?Android\n");return?0; }設(shè)置環(huán)境變量 envsetup.sh
export?PATH=$PATH:/home/tim/android-ndk-r10b/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin最后,運(yùn)行 make 就可以了
關(guān)于 -rpath-link選項(xiàng),請(qǐng)參考?gcc鏈接選項(xiàng)
?
第二種簡(jiǎn)單方法,使用shell腳本
#!/bin/shOS='linux' ANDROIDSDK='android-14'PROGDIR='/home/tim/android-ndk-r10b/'PROGDIR=`cd?$PROGDIR?&&?pwd` ARMEABIGCC=$PROGDIR/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc ARMEABILIB=$PROGDIR/platforms/$ANDROIDSDK/arch-arm/usr/lib ARMEABIINC=$PROGDIR/platforms/$ANDROIDSDK/arch-arm/usr/include ARMEABICRT="$ARMEABILIB/crtbegin_dynamic.o?$ARMEABILIB/crtend_android.o"LINKER=/system/bin/linkerecho?"GCC:"$ARMEABIGCC?"LIB:"$ARMEABILIB?"LINKER":$LINKER?"PARAMS:"$@ echo?"CRT:"$ARMEABICRT$ARMEABIGCC?$@?-Wl,-rpath-link=$ARMEABILIB,-dynamic-linker=$LINKER?-L$ARMEABILIB?$ARMEABICRT?-I$ARMEABIINC?-nostdlib?-lc保存為b
./b hello.c -o hello
就可以了
實(shí)際就是運(yùn)行命令
/home/tim/android-ndk-r10b/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc?\-Wl,-rpath-link=/home/tim/android-ndk-r10b/platforms/android-16/arch-arm/usr/lib,-dynamic-linker=/system/bin/linker?\-L/home/tim/android-ndk-r10b/platforms/android-16/arch-arm/usr/lib??\/home/tim/android-ndk-r10b/platforms/android-16/arch-arm/usr/lib/crtbegin_dynamic.o???/home/tim/android-ndk-r10b/platforms/android-16/arch-arm/usr/lib/crtend_android.o??\-I/home/tim/android-ndk-r10b/platforms/android-16/arch-arm/usr/include?-nostdlib?-lc?\hello.c?-o?hellocrtbegin_dynamic.o 和 crtend_android.o必須配對(duì)使用
第三種方法,用–sysroot也是可以的
#!/bin/shNDK=/home/tim/android-ndk-r8e SYSROOT=$NDK/platforms/android-9/arch-arm CC="$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc?--sysroot=$SYSROOT" CFLAGS='-march=armv7-a?-mfloat-abi=softfp?-mfpu=neon' LDFLAGS='-Wl,--fix-cortex-a8' $CC?$@http://www.srombauts.fr/2011/03/06/standalone-toolchain/
#include??<stdio.h> #include?<android/log.h>#define?LOGI(...)?((void)__android_log_print(ANDROID_LOG_INFO,?"hello-ndk",?__VA_ARGS__))int?main(void) {printf("Hello?from?NDKn");LOGI("Hello?from?NDK");return?0; }果然厲害,上面這段代碼都可以這樣編譯
./b9?-l log nl.c -o hn
用Makefile也能搞
CC??=?arm-linux-androideabi-gcc CFLAGS??=?-Wall?-g LDFLAGS?=?-llog SRC?=hello-ndk.c OBJ?=$(SRC:.c=.o) EXE?=hello-ndkall:?$(SRC)?$(EXE)$(EXE):?$(OBJ)$(CC)?-o?$@?$^?$(LDFLAGS)%.o:?%.c$(CC)?-o?$@?-c?$<?$(CFLAGS)clean:rm?-f?*.o?$(EXE)編譯so庫(kù)也是可以,厲害
CC??=?arm-linux-androideabi-gcc CFLAGS??=?-Wall?-g LDFLAGS?=?-llog?-shared SRC?=hello-ndk.c OBJ?=$(SRC:.c=.o) EXE?=libhello-ndk.so還可以直接運(yùn)行 gcc
/home/tim/android-ndk-r10/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc?--sysroot=/home/tim/android-ndk-r10/platforms/android-3/arch-arm???-lc?-lm???-g?main.c?-o?mm第4種方法,用ndk-build?
創(chuàng)建工程目錄hello,然后在其下創(chuàng)建子目錄jni
然后在jni下創(chuàng)建兩個(gè)文件,一個(gè)是hello.c,另外一個(gè)是Android.mk,內(nèi)容如下
其中 LOCAL_MODULE_TAGS := optional 這行可以不要
進(jìn)入到hello目錄下,運(yùn)行下面的命令
#?export?NDK_PROJECT_PATH=`pwd` #?ndk-build Compile?thumb??:?helloworld?<=?hello.c?Executable?????:?helloworld?Install????????:?helloworld?=>?libs/armeabi/helloworld轉(zhuǎn)載于:https://my.oschina.net/ruiwong/blog/626094
總結(jié)
以上是生活随笔為你收集整理的Compile a native C Android application的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: VHDL六层电梯控制器及仿真
- 下一篇: verilog中值滤波算法实现及仿真