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
具体的例子在这儿。