Compile a native C Android application
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
http://www.cnblogs.com/GoAhead/p/4186707.html
通過上網(wǎng)搜索,你可以發(fā)現(xiàn)很多種編譯Android native應(yīng)用的方法.我想說的是,不同的控制臺應(yīng)用, 守護(hù)程序(daemon), C/C++庫,等等.這些程序在你自己的計算機(jī)上
編譯沒有任何問題.
為了給Android編譯程序,你需要ARM工具鏈(toolchain). 我發(fā)現(xiàn)有兩種主張,分別是使用Android Prebuild toolchain和CodeSourcery
1)Android Prebuild toolchain
Android沒有使用傳統(tǒng)的libc庫.相反,它用了Bionic庫,一個由Google開發(fā)的,用在Android移動軟件平臺上的輕量級的libc
Bionic被裁剪到只支持 Android系統(tǒng). 請看?六百萬美元的c程序庫
2)CodeSourcery
CodeSourcery是ARM的合作伙伴. 專門為ARM處理器開發(fā)增強(qiáng)GUN工具鏈的,并提供驗證過的GNU工具鏈.這些工具鏈有很多不同的版本.
對于Android平臺,需要 arm-none-linux-gnueabi, 而 arm-none-eabi是沒有g(shù)libc包含在里面的,主要面向那些編譯完整的native庫和應(yīng)用(比如FreeRTOS)
譯者注: arm-none-eabi就是用來編譯裸機(jī)程序的,請參考?最簡單的ARM裸機(jī)程序
我個人的觀點,如果白手起家開始創(chuàng)建一個Android的應(yīng)用程序,你應(yīng)該選擇Bionic.
但是如果你選擇從你的PC環(huán)境移植一個庫到Android,你應(yīng)該選擇CodeSourcery
如果你使用到線程或者C++異常,Bionic庫也不能完全支持它們(實際上,它根本就不支持異常)
agcc.pl是Andrew Ross開發(fā)的一個腳本,讓你以一種很簡單的方法來自動包含常用的庫,使用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選項,請參考?gcc鏈接選項
?
第二種簡單方法,使用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
就可以了
實際就是運(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必須配對使用
第三種方法,用–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庫也是可以,厲害
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)建兩個文件,一個是hello.c,另外一個是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的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VHDL六层电梯控制器及仿真
- 下一篇: Android加载图片OOM错误解决方式