关于 Android 上面适用 Ubuntu/CentOS 等通过 NDK+CMAKE 等直接编译 NATIVE 程式的一些建议。

由于最近几个月才到 Android 上面适用 C/C++ 编程序,所以躺了非常多的坑,交了大量的技术、金钱、精力的不必要的学费。

所以本文就把过程中趟的坑及解决办法,列举一些出来,望后面的童靴们,不要在踏入这种深不见底的巨坑里面。

由于我们的程序主要都是靠 C/C++ 11 语言直接实现,原程序是在 Ubuntu 16/18 Linux 上通过CMAKE 3.X + GCC 5.4.X + VSCode C/C++调试并且开发的,所以很多套路还是按照 VC++/GCC 上面的套路在做,移植到 Android 上面躺了大量的巨坑

1、Android 上面编译 NATIVE C/C++ 原生程序(非SO动态链接库)必须要静态编译,原因则是 Android 不同的发行版系统可能没有提供 libstdc++...so...的库,缺少标准库DLL,C/C++程序根本运行不了,而且DLL库必须放到需要ROOT权限的目录去。

2、Android 上面静态编译 NATIVE 程序,Android 不是所有的指令集都可以正确的 LINK log(Android logcat library)【基本等同于没有 logcat 日志调试手段支持】静态编译了GDB调试器都没法用,所以注意自己写日志,要不好好发挥C/C++异常的排错手段。

3、Linux 上面通过NDK适用CMAKE编译程序默认适用的标准库可能不是 -stdlib=libc++,所以我们需要显示设置。

4、std::function 不可以通过 std::move 传送到另外一个变量,另外它还不是线程内存安全的与GCC是不同的,需特别注意,不然到时候各种内存BUG,坑死个人。

5、NDK上面提供的标准最好用 libc++,不要搞那些什么 stlport 这些东西,不然到时候排查问题,可能会搞死人的,因为不同的标准库实现不一定按照主流/标准实现来,虽然看上去是这么功能,写点测试代码,貌似没什么区别,但可能存在一些深坑之点,让人防不胜防,除非干脆只用 boost libraries。

6、ARM平台上结构内存对齐问题,结构可以是 class,也可以是 struct 声明的,主要结构声明的时候尽量保证4/8字存对齐,还有在读写堆栈的时候不要溢出,否则到时候可能被SIG_BUS(内存总线错误),到时候找问题,那么就只能上手IDA静态反汇编与C/C++代码一起抓到慢慢分析了。修改代码逐步尝试了,浪费时间,浪费精力,所以在编写C/C++代码的时候就应该尽量避免,可能会发生这样问题的可能性。

7、不要依赖与使用过多的C/C++标准库函数、模板、类等等,否则可能存在标准库兼容问题会让人很难受的。 

8、Linux 上面建议配置与 Android NDK使用版本相同的 clang 编译器,比如我们那个项目是NDK 20rb 版本则:clang8.x、libc++abi-8,虽然仍旧会有一些不同之处,但基本可以做到与 Android 编译器及库环境差不太多的情况下,只要注意的到基本不会出现重大难以解决的问题。

9、可以的情况下,建议通过C语言、Golang 语言编译 Android 上面原生代码程序,而不是适用C/C++,因为已提了上面的标准库坑的问题,用C语言,所有的一切都是自己做的,出问题也更容易判断,可以显著的减少解决问题的时间与发生问题的可能,用 Golang 大概可能是最经济实惠的方案了,几乎不会存在内存泄露,但是人为导致托管内存泄露那就没办法了。

10、尽量不要太相信 Android 一些系统函数返回的结果,都需要具备怀疑的眼光,因为不同厂商定制的 Android 发行版本系统某些函数返回值可能略有不同,这个只能靠童靴们自我去发现了,前几天发表过类似的某厂商定制的 Android 发行版,NATIVE系统函数不按套路来的一个兼容坑问题。

11、移植到 Android 平台上面使用 std::function 标准库模板,建议外部套一层 std::shared_ptr,这样可以相对轻松的解决多线程下潜在的内存安全问题,但是人们仍旧可以无视这条建议。

12、适用 boost::asio 在 Android 平台上面自由飞翔(网络访问)注意不要在外部对 boost::asio::ip::tcp::socket 关联的 socket-fd 执行原生的 shutdown, 用一下就没有办法在外访问网络了,虽然调用 tcp::socket 自身的shutdown 函数,看样子一时间不会挂,但最好不要这样操作,根据我们的测试,在华为鸿蒙操作系统2.0上面,大约8小时~24小时就会导致整个程序不能在访问网络,虽然不太理解为什么一个 shutdown 会导致断网,但既然出了这个现象删除这个代码就可以让程序自由访问,那么就删除了,这个问题就抛出来大家共同分析了。

... ...

未完待续...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值