问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

android ndk 用什么工具

发布网友 发布时间:2022-05-24 20:50

我来回答

1个回答

热心网友 时间:2023-11-01 07:24

首先需要确定目标机器的指令集。
如果是 x86 的机器,用 x86-4.4.3 版本的工具链;如果是 arm 指令的,用 arm-linux-androideabi-4.4.3 版本 (x86-4.4.3 和 arm-linux-androideabi-4.4.3 位于ndk目录中)
1、gcc 的sysroot 选项
sysroot 选项设定 gcc 在编译源码的时候,寻找头文件和库文件的根目录。可以这样调用 gcc --sysroot=/tmp/gcc-arm (及其他选项)。NDK 根目录下的 platforms 目录中的各个子目录的路径都可以直接传给 gcc --sysroot=<dir>。为了简化操作,可以在linux系统的命令终端执行以下命令,设置SYSROOT环境变量,$NDK是ndk的根目录。
$ SYSROOT=$NDK/platforms/android-8/arch-arm
2、调用 NDK gcc(第1种方法)。 设置 SYSROOT之后,要把它传给 gcc 的 --sysroot 选项。由于unix/linux自带的gcc并非交叉编译工具,而我们需要使用的是ndk中提供的交叉编译工具(也是gcc),所以需要想办法让编译脚本找到ndk中的gcc,而不要去寻找系统中的gcc。而 unix/linux 系统的编译脚本常常会用 CC 环境变量来引用编译器,所以通过把 CC 设置为ndk中的gcc的路径,就能帮助编译脚本找到正确的gcc(我们还能顺便加上--sysroot选项)。
将CC 按如下设置
$ export CC="$NDK/toolchains/<name>/prebuilt/<host-system>/bin/<prefix>gcc --sysroot=$SYSROOT"
$ $CC -o foo.o -c foo.c (不必执行这一行,这条命令是调用gcc编译程序)
上面第1行之后之后,再去执行./configure 就可以编译出arm程序了。不过还需要考虑共享库的链接问题,要确保该程序没有链接ndk未提供的共享库。该方法的缺陷就是,不能使用 C++ STL(STLport 或 GNU libstdc++ ),也不能使用异常机制和RTTI。
3、调用NDK编译器(第2种方法,更简单)
android ndk 提供脚本,允许自己定制一套工具链。例如:
$NDK/build/tools/make-standalone-toolchain.sh --platform=android-5 --install-dir=/tmp/my-android-toolchain [ --arch=x86 ]
将会在/tmp/my-android-toolchain 中创建 sysroot 环境和 工具链。--arch 选项选择目标程序的指令架构,默认是为 arm。
如果不加 --install-dir 选项,则会创建 /tmp/ndk/<toolchain-name>.tar.bz2。
(执行 make-standalone-toolchain.sh --help 查看帮助。)
运行之后,这样使用:
$ export PATH=/tmp/my-android-toolchain/bin:$PATH
$ export CC=arm-linux-androideabi-gcc
$ export CXX=arm-linux-androideabi-g++
$ export CXXFLAGS="-lstdc++"
执行完以上设置环境变量的命令之后,就可以直接编译了(例如,执行 ./configure 然后 make 得到的就是 arm 程序了)。不用再设定 sysroot, CC 了。而且,可以使用 STL,异常,RTTI。
4、ABI 兼容性
ndk 同时支持 arm5 和 arm7,一般只用 arm5就好了。arm7是高端一点的,NDK 默认也是 arm5 。
推荐加上 -mthumb 选项给gcc,来生成 16-bit Thumb-1 指令。
如果要用 arm7,可以设定 CFLAGS='-march=armv7-a -mfloat-abi=softfp', 使用 Thumb-2 指令,且这两个选项不能分开!
5、警告 & *
5.1 Windows支持
Windows 上的NDK 工具链不依赖 Cygwin,因而速度比用 Cygwin 快一点,但是这些工具不能理解
Cygwin 的路径名(例如, /cygdrive/c/foo/bar)。只能理解 C: /cygdrive/c/foo/bar 这类路径
不过,NDK 提供的build工具能够很好地应对上述问题(ndk-build)
5.2 wchar_t 支持
wchar_t 类型仅从 Android 2.3 开始支持。
在 android-9 上, wchar_t 是 4字节。 并且 C语言库提供支持宽字符的函数
(例外:multi-byte 编码/解码 函数 和 wsprintf/wsscanf )
在android-9 以前的平台上,wchar_t 是1字节,而且宽字符函数不起作用。
建议不使用 wchar_t,提供 wchar_t 支持是为了方便移植以前的代码。
5.3 异常, RTTI 和 STL
NDK 工具链默认支持C++异常和RTTI(Run Time Type Information),可以用 -fno-exception 和 -fno-rtti 关闭(生成的机器码更小)
注意: 如果要用这两个特性,需要显式链接 libsupc++。例如: arm-linux-androideabi-g++ .... -lsupc++
NDK 提供了 libstdc++,因而可以用 STL,但需要显式链接 libstdc++ ( gcc ... -lstdc++)。不过在将来可以不用手动指定这个链接参数。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
单位高温防护欠缺致员工中暑如何对待 狗狗为什么爱看视频 360浏览器怎么设置倍速播放 ...先讲女主的灵魂飘荡了一段时间,然后重生,请问是那本? 拯救者散热器怎么开 电脑如何一键还原系统电脑一键还原怎么操作 神舟笔记本电脑怎么重新设置神舟战神bios恢复出厂设置 神舟电脑恢复出厂设置神舟战神怎么恢复原厂系统 水泥楼梯如何铺木楼梯 家里面楼梯是水泥的不想铺地毯或者地砖还能铺什么 双卡手机如何注册两个? 如何在Ubuntu12.10下安装Android NDK 苹果手机双卡怎么注册另一个? 我手机是双卡的其中用联通号申请一 现在想用另一个移动号再申一个号怎么操作 求帮助 linux下怎么判断ndk环境变量ok了 我手机是双卡的其中用联通号申请一 现在想用另一个移动号再申一个号怎么操作 求帮助 Linux下NDK编译出的SO库能在WIndows下的android工程直接使用么? 如何安装android ndk 双卡手机怎么用两个? 双卡双待手机能注册两个吗?怎么注册第二个? linux下ndk-bulid编译形成了so文件,在windows环境下的eclipse怎么使用 微信,我一个手机两张卡可以注册两个吗? 双卡手机如何注册两个 千禧年三部曲:龙纹身的女孩 玩火的女孩 直捣蜂窝的女孩 TXT中文版全本 vvananan@gmail.com 求千禧年三部曲 txt格式~《龙纹身的女孩》、《玩火的女孩》和《直捣蜂巢的女孩;小时代全集txt 求千禧年三部曲《玩火的女孩》和《直捣蜂窝的女孩》的中文电子书txt或者PDF格式,英文版也要。不胜感激。 广告牌安装高空作业取费标准 求《千禧年》三部曲的TXT版 &lt;霓虹灯管的一般要求和安全要求&gt;内容到哪里找 我想要千禧年三部曲能发给我吗 一机双卡怎么设两个? android studio怎么配置ndk 一个手机号怎么申请第二个? oppo手机怎么把应用程序缓存数据设置成保存到外置SD卡? 双卡手机如何注册两个 OPPO手机怎样把存在于内置SD卡的应用存到外置SD卡上? 在股市里什么是割肉?什么是再抄底?什么是解套?..谢谢 根据以下材料请以孙大娘的名义给洪涛所在单位写一封表扬信?200字左右 南海区第14地中小学生书信节内容善美南海,乐善之城怎么写? 尿酸高早点适合吃点什么 PS局部放大图片细节,求过程,谢谢。如图显示的细节放大怎么操作的 傲卫汽车防盗报警系统手机上如何安装 卡西欧3232怎么设置闹钟 华为:dig/al100像机设置中如何找到参考线? ipad里怎么加入Emoji表情?能加入吗? 在哪办理独生子女证 齐齐哈尔独生子女证明在那里开 荣耀50怎样设置相簿及名称 甲骨文公司的名字是源于中国的甲骨文吗? 甲骨文公司的中文名是谁翻译的,它的英文名并不是甲骨文的意思啊?