文档章节

拒绝ndk-build (Android Native Development Kit)

Q_J
 Q_J
发布于 2015/06/10 16:03
字数 891
阅读 479
收藏 9

Eclipse或者Android Studio里都不能调试C, 实际还得在gdb命令行里做,那这些代码放在Eclipse里毫无用处。虽然据说新的Android Studio里集成了C/C++开发,但是到什么程度还不知道。

废话少说, 

直接用NDK里的gcc是这样的:  (假设NDK_ROOT已经被设定好了)

就是几个环境变量的事儿。

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有微妙区别)。

$CC a.c
$CXX a.cc

2016/07/28: 最新的[NDK里关于NDK的官方利用说明:Standalone Toolchain](https://developer.android.com/ndk/guides/standalone_toolchain.html) 里也提到了上述简化利用方法,说得更全面。

 

小菜都可以这样干,只是一些庞大的auto config之类交叉编译的时候,就有include和lib以及附属编译工具误用本机之类的问题,手动硬搞很辛苦。

所以还是得先生成一个正规的交叉编译用的一套东西(toolchain),里面就会包含gcc,include,lib等东西,当使用其中的gcc时,它会自动使用自己身边的include,lib作为系统目录,所以其中的bin/arm-linux-androideabi-gcc等工具可以直接使用而无须末尾指定--sysroot=...参数,配套工具都会自动从自己身旁找,不容易和本机的工具混淆。

正规的交叉编译用的toolchain的生成方法(只一次):例如生成到./std_toolchain目录下。

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,不满意的就自己换个固定数值。

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

具体的例子在这儿

© 著作权归作者所有

Q_J

Q_J

粉丝 12
博文 67
码字总数 54682
作品 0
日本
私信 提问
Android native debug: 手动使用gdbserver远程调试C代码

一般用java做一个Android app,里面夹杂着jni/*.c 所编译出来的lib,是可以通过gdb来调试的,也许大多数人都在按照网上各种帮助在使用,原理是比较古怪的:app里被塞进去一个gdbserver程序!...

Q_J
2015/06/19
221
0
android -------- Eclipse下的NDK配置环境

NDK 全称是Native Development Kit,是一个让开发人员在Android应用中嵌入使用本地代码编写的组件的工具集 原生开发工具包 (NDK) 是一组可让您在 Android 应用中利用 C 和 C++ 代码的工具。 ...

切切歆语
2018/04/24
15
2
初识 Android Native Development Kit (NDK)

Android开发者社区对JNI的呼声一直很高,这次Google发布NDK可以说是顺应民意。NDK和SDK一样提供了Linux、Windows、Mac三大开发平台的版本。 在Linux上,尤其是Debian/Ubuntu上进行安装,非常...

红薯
2009/07/03
15.2K
4
Android 原生开发工具包 NDK r14 发布

NDK (Native Development Kit) ,Android 原生开发工具包,是一个包含 API、交叉编译器、链接程序、调试器、构建工具、文档和示例应用程序的综合工具集。 最新版本的 Android NDK r14,现在可...

王练
2017/03/22
3.1K
6
Android JNI MAC OS环境配置

Android JNI MAC OS环境配置 http://whbzju.github.io/blog/2013/06/01/android-jni-config/ JUN 1ST, 2013 | COMMENTS 前言—JNI技术简介 JNI是Java Native Interface的缩写,即“Java本地调......

whb_zju
2013/06/02
2.2K
0

没有更多内容

加载失败,请刷新页面

加载更多

parseint和isNaN用法

本文转载于:专业的前端网站➭parseint和isNaN用法 <!doctype html><html><head><meta charset="utf-8"><title>无标题文档</title></head><body><script> var a='12'; alert......

前端老手
23分钟前
3
0
Kylin 精确去重在用户行为分析中的妙用

作者:史少锋,Apache Kylin committer & PMC,2019/10/11 在上次文章《如何在 1 秒内做到大数据精准去重》中,我们介绍了 Apache Kylin 为什么要支持大数据集上的精确去重,以及基于 Bitmap...

ApacheKylin
34分钟前
3
0
学习记录(二) es6基本语法(rest参数,模板化,axios模块,拦截器)

日常学习记录 模块化:把一个大文件分成多个小文件,按照一定规范进行拼接 es5写法: 导出:module.exports = 数据 导入:require("路径") /路径未添加后缀名时 //默认添加.js //把路径作为文件名...

Pole丶逐
38分钟前
3
0
以程序员的角度怎么购买一台「性价比高的电视」

前俩天有小伙伴在我的文章下留言,说能否把 【国内电视机都介绍一下】,今天我已在TV端开发多年的程序员的角度。谈谈已程序员的角度如何购买一台性价比高的电视。 国内大的电视机品牌介绍 长...

我们都很努力着
41分钟前
2
0
PhotoShop 色调:理解直方图/RGB通道信息

一、直方图:图表的形式,展示图像像素分布的情况 1.平均值:表示平均亮度 2.标准偏差值:表示亮度值范围内的中间值 3.像素: 表示用于计算直方图的像素总数 4.色阶:显示指针下面的区域亮度...

东方墨天
47分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部