日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Compile a native C Android application

發(fā)布時間:2023/12/19 Android 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Compile a native C Android application 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

crtbegin_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_PATH:=?$(call?my-dir) include?$(CLEAR_VARS) LOCAL_SRC_FILES:=hello.c LOCAL_MODULE?:=?helloworld LOCAL_MODULE_TAGS?:=?optional include?$(BUILD_EXECUTABLE)

其中 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。