Android NDK交叉编译问题与解决策略

需积分: 16 4 下载量 84 浏览量 更新于2024-09-13 收藏 896KB PDF 举报
"NDK交叉编译问题小记主要涵盖了在使用JNA方式编译C/C++项目时遇到的问题及相应的解决策略,特别涉及到在arm-linux-androideabi工具链下进行交叉编译的常见困难。文档作者指出,对于Android API级别28及以上,需要在pthread.h文件中添加特定的pthread_attr_setinheritsched和pthread_attr_getinheritsched函数声明。此外,还提到了在Tools.cpp文件中修改__sched_priority为sched_priority,以符合新的编译器路径下的定义。另外,为了兼容性,abs函数被替换为fabs,并引入了<cmath>头文件。在文件处理方面,将条件判断fp=fopen(pic_name,"wb")<0改为了fp=fopen(pic_name,"wb")==NULL。对于时间相关的头文件,需要在调用全局头文件global.h时修改相应名称。在遇到libc6-dev、gettext安装或重装问题时,作者尝试了sudo apt-get install libc6-dev以及brew的相关操作,但未解决问题。最后,解决找不到sys/fcntl.h头文件的方法是使用find命令搜索NDK中的缺失文件位置。" 详细说明: 1. **pthread.h的修改**:在使用Android API级别28及以上时,由于系统接口的变化,需要在pthread.h中添加pthread_attr_setinheritsched和pthread_attr_getinheritsched的函数声明,这两个函数与线程调度属性有关。 2. **Tools.cpp的调整**:在Tools.cpp源码中,作者发现__sched_priority与新的androideabi编译器路径下的sched.h中定义的不一致,因此将其更改为sched_priority。 3. **数学函数转换**:原始代码中的abs函数在某些情况下可能不被支持,因此需要替换为标准库提供的fabs函数,并引入<cmath>头文件。 4. **文件操作改进**:当打开文件失败时,原代码使用的是fp=fopen(pic_name,"wb")<0来判断,但更标准的做法是使用fp=fopen(pic_name,"wb")==NULL来检查文件打开是否成功。 5. **头文件引用问题**:部分文件名需要根据实际情况进行调整,例如时间相关的头文件,以确保编译时能找到正确的引用。 6. **库安装和重装尝试**:作者尝试通过sudo apt-get install libc6-dev和brew命令来安装或重新安装库,但这些操作并没有解决问题,表明可能是其他原因导致的编译错误。 7. **缺失头文件的查找**:当遇到找不到sys/fcntl.h头文件的问题时,可以使用find命令在NDK目录下搜索,找到正确的位置并引用。 NDK交叉编译时可能会遇到各种问题,包括兼容性、函数声明、库依赖等,需要开发者具备对C/C++和Android NDK的深入理解,以便能够诊断并解决这些问题。文档中的解决方法为遇到类似问题的开发者提供了一定的参考。