前一篇文章寫過通過ndk-build 簡(jiǎn)單的編譯Android 中c庫的方式了,這里再用更底層的方式茧球,直接通過ndk中的gcc來編譯。
前提條件
開發(fā)環(huán)境:mac Os
必須下載ndk星持,我用的是r17抢埋。
ndk在~/.bash_profile
中配置環(huán)境變量
export ANDROID_NDK_HOME=/Users/用戶名/Development/android-ndk-r17
export PATH=${PATH}:${ANDROID_NDK_HOME}:${ANDROID_NDK_HOME}/toolchains/arm-l inux-androideabi-4.9/prebuilt/darwin-x86_64/bin
然后這樣可以直接使用gcc工具了,命令測(cè)試一次:
$ arm-linux-androideabi-gcc
編譯一個(gè)例子
hello.c的代碼如下
#include <stdio.h>
int main() {
printf("hello,world!");
return 0;
}
然后命令行運(yùn)行:
$ arm-linux-gcc hello.c -o hello
但是督暂,缺報(bào)錯(cuò)了:
fatal error: stdio.h: No such file or directory
解決方法
接下來您需要做的是定義您的 sysroot(sysroot 是一個(gè)包含針對(duì)您的目標(biāo)的系統(tǒng)標(biāo)頭和庫的目錄)揪垄。 如需定義 sysroot,您必須知道原生支持的目標(biāo) Android API 級(jí)別逻翁;可用的原生 API 因 Android API 級(jí)別而異饥努。
針對(duì)相應(yīng) Android API 級(jí)別的原生 API 位于 $NDK/platforms/ 下;每個(gè) API 級(jí)別目錄又包含針對(duì)各種 CPU 和架構(gòu)的子目錄八回。 以下示例顯示如何針對(duì) ARM 架構(gòu)為以 Android 5.0(API 級(jí)別 21)為目標(biāo)的構(gòu)建定義 sysroot:
SYSROOT=$ANDROID_NDK_HOME/platforms/android-21/arch-arm
注: 這里的ANDROID_NDK_HOME 和前面自己設(shè)置的ndk的根目錄變量名要對(duì)應(yīng)起來
然后在進(jìn)行編譯就能通過了:
export CC="$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/ \
linux-x86/bin/arm-linux-androideabi-gcc-4.8 --sysroot=$SYSROOT"
$ CC -o hello.o -c hello.c
盡管此方法很簡(jiǎn)單酷愧,但它缺少靈活性:它不允許您使用任何 C++ STL(STLport驾诈、libc++ 或 GNU libstdc++)。 它也不支持例外或 RTTI溶浴。
具體復(fù)雜的編譯去看官網(wǎng)吧乍迄,我只不過想分步編譯,觀察編譯過程而已士败。