一、代码笔记
1.封装C文件中的数组长度,容易造成越界
2.声明后的对象未赋值,则数值可能会很诡异:全局,静态变量,一般默认为0; 局部变量在栈上,取决于此处原来的数据,如果不初始化的话;
声明后的对象要赋值或置null。
二、编译要点
1.cpp文件要用,头文件可能也需要包起来
#ifdef __cplusplus
extern "C" {
#endif
要对编译器提示使用C的方式来处理函数的话,那么就要使用extern "C"来说明。
2.so库编译成功但是其中方法找不到引用。
忽略编译引用错误可以生成动态库.so 文件,但是验证直接加载出错:方法没有被编进去库里面。
linux 查看 *.a *.so 符号表找到是否有,ubuntu 中交叉编译(比如编译PJsip)生成第一步So 文件正常,但是使用此so 文件作为动态库给其他模块编译用却发现部分方法找不到
image.png如图,在编译PJSIP 静态库.a中是有该方法 编译动态库.so后就找不到了。所以以动态库为依赖的新模块编译若是依赖此so 文件必然编译失败:无法定位引用方法。
怀疑ndk 编译过程中把 没有被引用的方法 忽略了,推测编译环境原因和ndk版本原因,解决办法造成未被引用方法找不到,重新声明使用部分空方法,保证原来的方法被编进去。
3.编译依赖模块顺序问题
多模块编译且模块有依赖模块编译顺序错乱也会失败,如:
动态库a.so ,b部分依赖a需要源码编译,C模块同时依赖a、b需要进行源码编译,D模块依赖b、c模块,而最终封装是在D模块之上。
正常逻辑应是b-c-d,但实际却出现编译顺序错乱造成编译失败,
最后按照要使用顺序用字母顺序在每个Android.mk中重新定义LOCAL_MODULE.
4.文件权限
ubuntu 子系统
可能要給文件夾所有权限和编译命令文件。
sudo chmod +x build_android.sh
sudo ./build_android.sh
5.编译方式
debug版本和release版本差异
直接通过Android Studio 连接设备debug版本没有问题能够运行,打release 版本就不行。
最后发现是声明对象未重置造成。
建议还是zaiTerminal 中配置ndk-build方式 直接编译relese so文件。
网友评论