拒绝ndk-build (Android Native Development Kit)

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

具体的例子在这儿

相关文章
相关标签/搜索