ndk编译 错误:dlopen failed:cannot locate symbol "一个符号" referenced by "你的库.so/.a" lang.UnsatisfiedLinkErr

本文分享了一次解决Android NDK编译中符号未找到问题的经历,涉及到多个.a库的整合与mk文件配置,最终成功实现了跨模块的库文件引用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在某家公司做实习生,从事移植工作,公司要求将以前跑在linux老设备上的程序移植到android平台上。项目很大一部分是c++写的,所以需要用ndk把所有源代码编到android平台下,当然也包括所依赖的第三方库。第三方库还比较好说,因为boost,openssl,websocket这些库要么对android有很好的支持,要么有开源项目去辅助支持。所以主要工作还是编译源代码问题,代码量相当庞大。

因为在学校的时候很少做c++开发和编译工作,所以解决问题很困难,这几天就有一个很怪异的问题缠绕着我。

问题是这样的,由于保密措施,项目代码都是分离的,每个人都只有自己的一部分。所以我的同事需要用ndk编好他的代码和他依赖的第三方库,编程.a库,然后另一个同事再依赖前一个同事 的.a库和第三方库,这样一层一层..........最后我拿到这个模块的库再去编。


结果出问题了,在用jni去调这个库的时候:

cao,这是怎么回事?他说找不到这个符号,但打开.a文件,可以看到这个符号。于是就怀疑库是不是没引进来,问了下同事,同事说.a的库编译的时候其他库都会引进来。但看了看文件大小,模块的.a库只有7M,但那些第三方库却有几百M,很明显,没引进来。google了一下,是mk文件有问题。


最后一句include $(PREBUILT_STATIC_LIBRARY),预编译的模块不会出发构建过程。只是把预编译的共享库拷贝到$PROJECT/obj/local路径,静态库则是拷贝到$PROJECT/libs/并进行裁剪。

所以,如果我要编这个模块的话,要把每个同事所依赖的.a全部引进来。没错,全部。

测试通过,成功跑起。


2025-03-17 00:22:45.876 15333-15436 OCR car.bkrc.com.car2024 D 创建新的 Predictor 实例 2025-03-17 00:22:45.897 15333-15439 System.err car.bkrc.com.car2024 W at com.baidu.vis.ocrgeneralocr.Predictor.<clinit>(Predictor.java:75) 2025-03-17 00:22:45.897 15333-15439 System.err car.bkrc.com.car2024 W at com.baidu.vis.ocrgeneralocr.Predictor.getAlgorithmId(Predictor.java:102) 2025-03-17 00:22:45.897 15333-15439 Predictor car.bkrc.com.car2024 E ocrgeneralocr_1_0_0 2025-03-17 00:22:45.899 15333-15439 linker car.bkrc.com.car2024 W Warning: "/data/app/~~p3wxVeR7eUxytcSwEORwTA==/car.bkrc.com.car2024-6SP23fUV_-2e7npIQ9urvA==/base.apk!/lib/arm64-v8a/libocrgeneralocr_1_0_0.so" unused DT entry: DT_RPATH (type 0xf arg 0x7e4c) (ignoring) 2025-03-17 00:22:45.916 15333-15436 Predictor car.bkrc.com.car2024 D 模型路径: /data/user/0/car.bkrc.com.car2024/cache/models/ocr 2025-03-17 00:22:45.916 15333-15436 Predictor car.bkrc.com.car2024 I model path/data/user/0/car.bkrc.com.car2024/cache/models/ocr/det_db.nb ; /data/user/0/car.bkrc.com.car2024/cache/models/ocr/rec_crnn.nb;/data/user/0/car.bkrc.com.car2024/cache/models/ocr/cls.nb 2025-03-17 00:22:45.916 15333-15436 OCRPredictorNative car.bkrc.com.car2024 D 尝试加载 libNative.so 2025-03-17 00:22:45.917 15333-15436 OCRPredictorNative car.bkrc.com.car2024 E 加载失败: dlopen failed: cannot locate symbol "_ZN6paddle8lite_api10ConfigBase20set_opencl_precisionENS0_15CLPrecisionTypeE" referenced by "/data/app/~~p3wxVeR7eUxytcSwEORwTA==/car.bkrc.com.car2024-6SP23fUV_-2e7npIQ9urvA==/base.apk!/lib/arm64-v8a/libNative.so"... 2025-03-17 00:22:45.917 15333-15436 OCR car.bkrc.com.car2024 D 模型初始化结果: 失败 2025-03-17 00:22:45.917 15333-15436 System.out car.bkrc.co
03-17
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值