Compile a native C Android application

來源:互聯網
上載者:User

標籤:

原文: Compile a native C Android application
翻譯: Zhiwei.Li

通過上網搜尋,你可以發現很多種編譯Android native應用的方法.我想說的是,不同的控制台應用, 精靈(daemon), C/C++庫,等等.這些程式在你自己的電腦上
編譯沒有任何問題.

為了給Android編譯器,你需要ARM工具鏈(toolchain). 我發現有兩種主張,分別是使用Android Prebuild toolchain和CodeSourcery
1)Android Prebuild toolchain
Android沒有使用傳統的libc庫.相反,它用了Bionic庫,一個由Google開發的,用在Android移動軟體平台上的輕量級的libc
Bionic被裁剪到只支援 Android系統.  請看 六百萬美元的c程式庫

2)CodeSourcery
CodeSourcery是ARM的夥伴. 專門為ARM處理器開發增強GUN工具鏈的,並提供驗證過的GNU工具鏈.這些工具鏈有很多不同的版本.
對於Android平台,需要 arm-none-linux-gnueabi, 而 arm-none-eabi是沒有glibc包含在裡面的,主要面向那些編譯完整的native庫和應用(比如FreeRTOS)
譯者注: arm-none-eabi就是用來編譯裸機程式的,請參考 最簡單的ARM裸機程式

我個人的觀點,如果白手起家開始建立一個Android的應用程式,你應該選擇Bionic.
但是如果你選擇從你的PC環境移植一個庫到Android,你應該選擇CodeSourcery
如果你使用到線程或者C++異常,Bionic庫也不能完全支援它們(實際上,它根本就不支援異常)

agcc.pl是Andrew Ross開發的一個指令碼,讓你以一種很簡單的方法來自動包含常用的庫,使用Android的ARM工具鏈gcc
某種程度上,他像makefile

第1種方法  使用Makefile和Android NDK

AR = arm-linux-androideabi-arAS = arm-linux-androideabi-asCC = arm-linux-androideabi-gccCXX = arm-linux-androideabi-g++LD = arm-linux-androideabi-ld.goldNDK_KIT = /home/tim/android-ndk-r10bPLATF_KIT = platforms/android-9ARM_INC = $(NDK_KIT)/$(PLATF_KIT)/arch-arm/usr/includeARM_LIB = $(NDK_KIT)/$(PLATF_KIT)/arch-arm/usr/libOBJS = hello.oEXES = 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;}

設定環境變數 envsetup.sh

export PATH=$PATH:/home/tim/android-ndk-r10b/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin

最後,運行 make 就可以了

關於 -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-gccARMEABILIB=$PROGDIR/platforms/$ANDROIDSDK/arch-arm/usr/libARMEABIINC=$PROGDIR/platforms/$ANDROIDSDK/arch-arm/usr/includeARMEABICRT="$ARMEABILIB/crtbegin_dynamic.o $ARMEABILIB/crtend_android.o"LINKER=/system/bin/linkerecho "GCC:"$ARMEABIGCC "LIB:"$ARMEABILIB "LINKER":$LINKER "PARAMS:"[email protected]echo "CRT:"$ARMEABICRT$ARMEABIGCC [email protected] -Wl,-rpath-link=$ARMEABILIB,-dynamic-linker=$LINKER -L$ARMEABILIB $ARMEABICRT -I$ARMEABIINC -nostdlib -lc

儲存為b
./b hello.c -o hello
就可以了

實際就是運行命令

/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 hello

crtbegin_dynamic.o 和 crtend_android.o必須配對使用

第三種方法,用–sysroot也是可以的

#!/bin/shNDK=/home/tim/android-ndk-r8eSYSROOT=$NDK/platforms/android-9/arch-armCC="$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 [email protected]

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-gccCFLAGS  = -Wall -gLDFLAGS = -llogSRC =hello-ndk.cOBJ =$(SRC:.c=.o)EXE =hello-ndkall: $(SRC) $(EXE)$(EXE): $(OBJ)    $(CC) -o [email protected] $^ $(LDFLAGS)%.o: %.c    $(CC) -o [email protected] -c $< $(CFLAGS)clean:    rm -f *.o $(EXE)

編譯so庫也是可以,厲害

CC  = arm-linux-androideabi-gccCFLAGS  = -Wall -gLDFLAGS = -llog -sharedSRC =hello-ndk.cOBJ =$(SRC:.c=.o)EXE =libhello-ndk.so

還可以直接運行 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 
建立工程目錄hello,然後在其下建立子目錄jni
然後在jni下建立兩個檔案,一個是hello.c,另外一個是Android.mk,內容如下

LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_SRC_FILES:=hello.cLOCAL_MODULE := helloworldLOCAL_MODULE_TAGS := optionalinclude $(BUILD_EXECUTABLE)

其中 LOCAL_MODULE_TAGS := optional  這行可以不要

進入到hello目錄下,運行下面的命令

# export NDK_PROJECT_PATH=`pwd`# ndk-buildCompile thumb  : helloworld <= hello.c Executable     : helloworld Install        : helloworld => libs/armeabi/helloworld

Compile a native C Android application

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.