Eclipse或者Android Studio裏都不能調試C, 實際還得在gdb命令行裏作,那這些代碼放在Eclipse裏毫無用處。雖然聽說新的Android Studio裏集成了C/C++開發,可是到什麼程度還不知道。html
廢話少說, linux
直接用NDK裏的gcc是這樣的: (假設NDK_ROOT已經被設定好了)android
就是幾個環境變量的事兒。c++
MAX_API_LVL=`cd $NDK_ROOT/platforms && ls -d android-?? | tail -n 1 | sed s/android-//` SYS_ROOT=$NDK_ROOT/platforms/android-$MAX_API_LVL/arch-arm TOOL_CHAIN_DIR=`ls -d $NDK_ROOT/toolchains/arm-linux-androideabi-*/prebuilt/* | tail -n 1` CC="$TOOL_CHAIN_DIR/bin/arm-linux-androideabi-gcc --sysroot=$SYS_ROOT" CXX="$TOOL_CHAIN_DIR/bin/arm-linux-androideabi-g++ --sysroot=$SYS_ROOT" CXX="$CXX -fno-rtti -fno-exceptions" ##STL_ROOT=`ls -d $NDK_ROOT/sources/cxx-stl/gnu-libstdc++/?.? | tail -n 1` || exit 1 ##CXX="$CXX -I$STL_ROOT/include -I $STL_ROOT/libs/armeabi/include"
第1行是自動取最大Android API Level。能夠強制改爲14(表示Android4.0)之類的特定值。
第3行裏的androideabi-*的*是gcc版本號,自動取最大號。能夠強制換成4.8之類的。
STL_ROOT那兩行是爲了C++的stl庫的,用得着時就去掉註釋。
而後就能夠用$CC和$CXX來編譯C和C++ ($CC也能編譯C++可是和$CXX有微妙區別)。git
$CC a.c $CXX a.cc
2016/07/28: 最新的[NDK裏關於NDK的官方利用說明:Standalone Toolchain](https://developer.android.com/ndk/guides/standalone_toolchain.html) 裏也提到了上述簡化利用方法,說得更全面。github
小菜均可以這樣幹,只是一些龐大的auto config之類交叉編譯的時候,就有include和lib以及附屬編譯工具誤用本機之類的問題,手動硬搞很辛苦。shell
因此仍是得先生成一個正規的交叉編譯用的一套東西(toolchain),裏面就會包含gcc,include,lib等東西,當使用其中的gcc時,它會自動使用本身身邊的include,lib做爲系統目錄,因此其中的bin/arm-linux-androideabi-gcc等工具能夠直接使用而無須末尾指定--sysroot=...參數,配套工具都會自動從本身身旁找,不容易和本機的工具混淆。api
正規的交叉編譯用的toolchain的生成方法(只一次):例如生成到./std_toolchain目錄下。bash
MAX_API_LVL=`cd $NDK_ROOT/platforms && ls -d android-?? | tail -n 1 | sed s/android-//` $NDK_ROOT/build/tools/make-standalone-toolchain.sh --install-dir=./std_toolchain --platform=android-$MAX_API_LVL
同理,MAX_API_LVL是自動取得最大的Android API level,不滿意的就本身換個固定數值。ide
2016/07/28: 上面的make...sh報警將要過期,因此最後一句改爲make.....py了:
$NDK_ROOT/build/tools/make_standalone_toolchain.py --install-dir ./std_toolchain --arc arm --api $MAX_API_LVL
而後,最好把toolchain裏的bin目錄加到PATH裏。
export PATH="$PWD/std_toolchain/bin:$PATH"
能夠測試一下其中的gcc用起來不須要--sysroot=...參數的。
arm-linux-androideabi-gcc a.c arm-linux-androideabi-g++ a.cc
而後,該幹嗎幹嗎。例如,交叉編譯ffmpeg:
OTHER_FFMPEG_OPTIONS="--disable-everything --disable-doc --enable-protocol=pipe --enable-filter=scale --enable-filter=crop --enable-filter=transpose --enable-demuxer=rawvideo --enable-decoder=rawvideo --enable-muxer=image2 --enable-muxer=image2pipe --enable-muxer=mjpeg --enable-encoder=mjpeg --enable-encoder=png" ./configure --enable-cross-compile --cross-prefix=arm-linux-androideabi- \ --target-os=linux --arch=arm \ $OTHER_FFMPEG_OPTIONS
注意cross-prefix設定成了"arm-linux-androideabi-",這個纔是接口之處,全部的gcc等命令名都會被插入這個前綴。若是不把toolchain的bin目錄加到PATH裏,那麼cross-prefix得加上全路徑,例如$PWD/std_toolchain/bin/arm-linux-androideabi-。
顯然toolchain方法更加靠譜,不用指定那什麼sysroot了。
2016/07/28:發現ndk-build能夠經過選項指定不用那破jni目錄了。例如:
ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk
具體的例子在這兒。