美文网首页
ndk 编译笔记

ndk 编译笔记

作者: silencefun | 来源:发表于2021-06-30 15:18 被阅读0次

    一、代码笔记

    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文件。

    相关文章

      网友评论

          本文标题:ndk 编译笔记

          本文链接:https://www.haomeiwen.com/subject/holoeltx.html