在NDK工程中使用预构建库时,可以选择使用.so动态库或者.a静态库。so文件是共享库(shared library)的一种格式,程序在运行时动态链接so库中的代码,而不是像.a静态库编译时静态链接。
如下图,本次闪退为cppcrash,说明so加载链接完成,但是在代码运行时出现错误,根据下图Reason反馈得知由于空指针访问导致的报错。

若闪退并非cppcrash而是jscrash,如下图,则说明js在访问so或者so加载链接出现问题,需要进一步定位。

ArkTS出错位置和so对外导出的头文件如下二图:


由于在不同平台中软链接格式不同,此处以Linux为例。在Linux平台进行交叉编译时,一些源码通过编译链接后会生成多个链接文件,如下图。libjpeg.so/libjpeg.so.62均为链接文件,占用空间很小,而实际的so文件则为libjpeg.so.62.4.0,如果只拷贝链接文件会导致无法链接到真正的so文件。

通过readelf -d xxx.so命令可以读取so文件中依赖的so文件,以下图libavcodec.so为例。该so同时依赖了libswreasample.so\libavutil.so\libz.so\libc.so,需要确保如上so均打包进入HAP中或者存在于HarmonyOS的系统库中。
