NDK移植编译 android-ndk-r10dNDK基本流程-全球时讯
I. 基本流程
1.设置环境变量
【资料图】
建议去官网下载最新版本的NDK,老版本很多宏定义缺失,比较麻烦。同时,之前用android-ndk-r10d,需要安装32位库环境。
yum install libstdc++-devel.i686yum install libzip.i686
#!/bin/bash# environment settingexport ANDROID_NDK_PATH=/opt/android-ndk-r14bexport TOOLCHAINS_PATH=${ANDROID_NDK_PATH}/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/binexport PATH=${PATH}:${TOOLCHAINS_PATH}export SYSROOT_PATH=${ANDROID_NDK_PATH}/platforms/android-22/arch-armexport LIBSTD_PATH=${ANDROID_NDK_PATH}/sources/cxx-stl/gnu-libstdc++/4.9export CC=arm-linux-androideabi-gccexport CXX=arm-linux-androideabi-g++export AR=arm-linux-androideabi-arexport CFLAGS="-DANDROID -fPIC -std=c++11 -ffunction-sections -funwind-tables -fstack-protector -no-canonical-prefixes -fexceptions -frtti -marm -march=armv7-a -mtune=cortex-a8 -mfloat-abi=softfp -mfpu=neon -mthumb -fno-strict-aliasing -finline-limit=64 -Wa,--noexecstack -Wformat -Werror=format-security -g -Wall --sysroot=${SYSROOT_PATH} -I${LIBSTD_PATH}/include -I${LIBSTD_PATH}/libs/armeabi/include -I${ANDROID_NDK_PATH}/sources/android/cpufeatures/"export LDFLAGS="--sysroot=${SYSROOT_PATH} -L${LIBSTD_PATH}/libs/armeabi -lgnustl_shared -lgcc -no-canonical-prefixes -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -lstdc++ -lsupc++ -lc -lm -pthread"
只要事先运行脚本,基本能应对一般的库(包括开源库)的编译。 因为C编译CFLAGS中不存在-std=c++11和-frtti,也不需要STL库gnustl_shared和C++库supc++ ,所以编译纯C库的时候建议移除他们
2.修改Makefile模板,针对EXE情况做特殊处理
GCC=$(CROSS)gccGXX=$(CROSS)g++AR=$(CROSS)arifeq ($(CROSS),arm-linux-androideabi-)ifdef EXE_TARGETCFLAGS += -pie -fPIELDFLAGS += -pie -fPIEendifendif
##3.PTLIB的configure参数 注意,这里的configure文件我做了少量修改。仅个人记录用。
./configure --enable-exceptions --host=armv7-a-android --disable-openssl --disable-shmaudio --enable-shmvideo=no --disable-resolver --enable-serial=no --disable-v4l2
II. 心得
1.主要的头文件目录
/opt/android-ndk-r14b/platforms/android-22/arch-arm/usr/include
/opt/android-ndk-r14b/sources/cxx-stl/gnu-libstdc++/4.9/include
##2.编译错误解决 1)部分原来是/usr/include/sys下的头文件路径可能有变化,直接在incude目录下。 2)出现链接错误时,务必用arm-linux-androideabi-nm检查下是否没实现。存在头文件与库文件不一致的现象。
2.ifaddrs.h不存在
1)使用libuv库内的 android-ifaddrs即可。部分版本可能有坑。 **注意更新,libuv也迭代了几个版本过。
III. ADB使用
以Linux版本的adb为例;Win的版本也可以,但是总体操作Linux下的方便很多
#!/bin/bash#连接adb connect#进入shelladb shell#如果有多个链路,可以这样选择,端口缺省5555adb -s:shell#传输文件adb push 1.txt /storage/emulated/0/#所有动态库需要放置在/system/lib目录下,需要赋予/system目录读写权限,或设置LD_LIBRARY_PATHmount -o remount,rw /system#大多数命令需要busybox驱动,例如vi,ifconfig等busybox vi 1.txt
IV.查看依赖(类似于ldd)
使用readelf函数可以读取动态库或EXE的依赖,下面是示例:
arm-linux-androideabi-readelf -d libjanus_streaming.so Dynamic section at offset 0x25bd8 contains 42 entries: Tag Type Name/Value 0x00000003 (PLTGOT) 0x26d80 0x00000002 (PLTRELSZ) 1256 (bytes) 0x00000017 (JMPREL) 0x2784 0x00000014 (PLTREL) REL 0x00000011 (REL) 0x22b4 0x00000012 (RELSZ) 1232 (bytes) 0x00000013 (RELENT) 8 (bytes) 0x6ffffffa (RELCOUNT) 145 0x00000006 (SYMTAB) 0x148 0x0000000b (SYMENT) 16 (bytes) 0x00000005 (STRTAB) 0xd88 0x0000000a (STRSZ) 3651 (bytes) 0x00000004 (HASH) 0x1bcc 0x00000001 (NEEDED) Shared library: [libcurl.so] 0x00000001 (NEEDED) Shared library: [libssl.so.1.1] 0x00000001 (NEEDED) Shared library: [libcrypto.so.1.1] 0x00000001 (NEEDED) Shared library: [libz.so] 0x00000001 (NEEDED) Shared library: [libglib-2.0.so.0] 0x00000001 (NEEDED) Shared library: [libpcre.so] 0x00000001 (NEEDED) Shared library: [libintl.so] 0x00000001 (NEEDED) Shared library: [libiconv.so] 0x00000001 (NEEDED) Shared library: [libjansson.so] 0x00000001 (NEEDED) Shared library: [libgnustl_shared.so] 0x00000001 (NEEDED) Shared library: [libstdc++.so] 0x00000001 (NEEDED) Shared library: [libc.so] 0x00000001 (NEEDED) Shared library: [libm.so] 0x00000001 (NEEDED) Shared library: [libdl.so] 0x0000000e (SONAME) Library soname: [libjanus_streaming.so.0] 0x0000001a (FINI_ARRAY) 0x26bcc 0x0000001c (FINI_ARRAYSZ) 8 (bytes) 0x00000019 (INIT_ARRAY) 0x26bd4 0x0000001b (INIT_ARRAYSZ) 4 (bytes) 0x0000000f (RPATH) Library rpath: [/opt/android-libs/lib] 0x00000010 (SYMBOLIC) 0x0 0x0000001e (FLAGS) SYMBOLIC BIND_NOW 0x6ffffffb (FLAGS_1) Flags: NOW 0x6ffffff0 (VERSYM) 0x20f0 0x6ffffffc (VERDEF) 0x2278 0x6ffffffd (VERDEFNUM) 1 0x6ffffffe (VERNEED) 0x2294 0x6fffffff (VERNEEDNUM) 1 0x00000000 (NULL) 0x0
V.GDB使用
android下使用gdbserver和gdb配套使用。两个版本必须一致。建议用你NDK目录下的那一对。 整体思路和一般的ARM设备调试类似。
拷贝gdbserver到Android设备上
cd /opt/android-ndk-r14b/prebuilt/android-arm/gdbserveradb push gdbserver /sdcard/share
在Android下启动gdbserver
端口可以随意调整,本文以9999为例
#手工跑./gdbserver 0.0.0.0:9999 ./test_program args#附加进程./gdbserver --attach 0.0.0.0:9999 pid
在调试机上运行gdb 可以在Linux下也可以在Windows下运行,以Linux下运行为例:
cd /opt/android-ndk-r14b/prebuilt/linux-x86_64/bin#windows下的话就是D:\android-ndk-r14b\prebuilt\windows-x86_64\binadb pull /system/lib/libc.so .adb pull /system/lib/libm.so .……需要把所有依赖的动态库,都放置到当前准备调试的目录下系统相关的动态库也必须补齐,否则堆栈无法正确分析……./gdbtarget remote:9999c
后面就和普通的gdb无差别了
标签:
相关推荐:
最新新闻:
- 【scrapy】scrapy使用pycharm打开项目目录-当前热点
- 钉钉内置的“群直播”功能怎么用?教你一招-全球报资讯
- 环球速读:【教程】PyTorch中文版官方教程出炉
- 世界动态:《幽灵线:东京》“蜘蛛丝”更新将添加肉鸽模式和剧情扩展
- 《实习班主任》好评发售中,更新繁体版本及更多游戏内容!
- 百度“文心一言”正式发布!现场续写三体 全球短讯
- 《原始袭变》B测容量曝光 只有30G不到
- NDK移植编译 android-ndk-r10dNDK基本流程-全球时讯
- 今日英语四级考级只能在大学考吗_英语考级可以直接考四级吗
- 随时随地实现大屏自由!16英寸2K便携显示器低至689元_通讯
- 【长测】3500捡漏折叠屏:日常使用篇
- 13代i9+锐炫A370M,联想小新Pro27 2023一体机发布 世界热文
- 林氏木业家具旗舰店聚焦消费者实际需求
- 荣耀手机推出“一翻即扫”功能,扫码不用点开支付宝
- OPPO Find X6系列官宣 “专业相机”设计彰显影像实力_全球微动态
- 微软签署第四份10年协议 《使命召唤》将登陆更多平台
- 知名爆料人:《生化危机4重制》共有40个奖杯
- 环球头条:谷歌眼镜全面停售:产品线终结 9月将结束软件支持
- iPhone 15 Pro真机泄露:边框圆润 外观变化大 全球球精选
- iPhone加大印度代工量:但合格率堪忧
- 苹果要对iPhone 15 Pro涨价 直接过万
- 当前时讯:杀疯了!256GB USB3.2 U盘跌破百元
- 杨紫琼×吴彦祖《美生中国人》艺术海报释出 中西合璧:每日速看
- 卡普空《恐龙浩劫》B测PS平台容量曝光:PS5版27GB|当前通讯
- iPhone 14补贴价4899元 新版黄色也有好价
- 微星新款34英寸显示器发布:175Hz高刷 8999元|天天视点
- 办公自动化是什么意思有证书?_办公自动化是什么:环球百事通
- iPhone 15 Pro Max最强 独占技术:涨价了
- 小米MIUI 14将推第三批:小米10等老旗舰将升级
- iPhone 13系列重新上架:直接立减2300|今日最新
- 卡普空《恐龙浩劫》超长实机 高科技战士爆杀原始恐龙
- 蟋蟀主题收集养成游戏《沉默的蟋蟀》上架Steam
- 马保国:B站年轻人很过分 赚6个亿后栽赃我 没起诉是给面子 世界视讯
- 《炉石传说》被移出亚运会项目 因暴雪国服已关闭
- FavoriteVideo是什么文件?FavoriteVideo的两种情况简述
- 格式化的U盘怎么恢复?格式化的U盘恢复全教程
- 如何用磁盘清理命令清理磁盘垃圾?教你清理磁盘的实用攻略
- 如何将账户设置为管理员账户?设置win10账户为管理员账户的方法
- proteus元件库使用说明 如何制作proteus元件?
- 笔记本电脑如何外接显示屏?电脑显示屏参数怎么调最合理?
- 超级硬盘数据恢复软件如何破解?超级硬盘数据恢复软件使用教程
- esd文件是什么?C盘中的ESD文件可以删除吗?
- 无法格式化D盘提示被占用要怎么解决?D盘无法格式化被占用解决教程
- 万能u盘驱动有什么用?万能u盘驱动安装说明
- 系统崩溃是什么原因造成的?有没有避免系统崩溃的办法?
- 天天热点评!OPPO Find X6 系列官宣3月21日正式发布 移动影像新时代来临
- 小米首款智能鱼缸今天正式开售:399元、半年免换水_最新
- 魔兽世界怎么修改字体大小?改字体大小教程
- 骁龙870神U加持!8GB+128GB神机低至2249元 世界时快讯
- 什么是热键冲突?热键冲突被占用怎么解决?
- 内存卡坏了怎么修复?七种修复内存方法介绍
- 鼠标出现连击怎么办?鼠标出现连击的处理方案
- 从同人作者到游戏制作人 醋仙的“顶流偶像”之路
- 天天速读:曝《炉石传说》或被移出亚运项目!因暴雪网易未续约
- Switch在线新追加游戏上线 《星之卡比2》等4款经典-每日热文
- 【世界独家】尼尔:《最后生还者》第1季最后一集神秘黑影不是艾比
- 热头条丨恐怖新作《The Kindeman Remedy》公布 疯狂医生恐怖实验
- 《怪物猎人崛起:曙光》发布新活动任务 获得称号奖励 环球百事通
- 港股异动 | 大唐新能源(1798.HK)涨4.5% 2月发电量同比增加16.57%
- 【世界新视野】长江存储颗粒!2T固态硬盘跌至569元
- 中国土豪109万拿下《CS:GO》AK47野荷皮肤 当前视点
- 环球聚焦:小米首款智能鱼缸399元开售 3个月不用喂食
- 王者荣耀镜新皮肤爆料,玫瑰异探外观公布,形似露娜又一款经典
- 【全球速看料】安森美扩展蓝牙低功耗微控制器系列到汽车无线应用
- 【全球时快讯】《勇者斗恶龙12》故事基本完成 制作人:游戏会很有趣
- 欧美服PS Plus高级会员3月新入库游戏公布:《神秘海域:盗贼遗产合集》等:焦点热门
- 《漂泊牧歌》开发商Stray Fawn工作室成立发行部门_全球观察
- HBO剧集《最后的生还者》蓝光盘7月17日发售 定价40英镑:每日讯息
- kingsoft是什么文件夹?kingsoft删除影响wps使用吗?
- 记事本出现乱码怎么办?Win7记事本乱码的修复方法
- 什么是xbox360游戏模拟器?如何让xbox360模拟器游戏英文转中文版?
- scrolllock是什么意思?scrlock键起什么作用?scrolllock键功能
- wifi静态什么意思?打印机wifidirect怎么开启?
- Zip是什么意思?ZIP文件格式 常见压缩文件格式分享
- cmd命令如何进入d盘文件夹?cmd命令进入d盘文件夹方法