Android NDK 引入预编译库的方法

本文介绍了在Android项目中遇到的NDK编译时第三方库消失的问题,以及通过创建Android.mk文件和预编译库模块来解决这个问题的方法。详细步骤包括在jni目录下创建prebuilt目录,存放预编译库,并在Android.mk中声明预编译库模块,使得NDK在编译时不删除第三方so库。

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

1. 无关紧要的话

        事情的起因是项目有地理编码需求,于是下了百度地图的相关jar和so文件。本来在测试程序中直接把jar和so文件拷到相应目录下就可以了,但是将代码整合到项目里面时,发现死活没法定位。把百度地图开发需要的配置又搞了一遍,demo又研究了几遍,就是没发现问题。快急哭的时候,不经意间点开了libs/armeabi这个文件夹,才发现直接拷进去的so库都没了!原来,我们那个项目需要编写JNI接口,用NDK来编译C/C++代码生成so库,而NDK在build的时候会先把libs/armeabi清空,再重新生成so库。如果libs/armeabi有第三方库的话,(比如这次拷进去的百度地图LBS相关的库)这些第三方库就会被清掉。衰!

2. 解决办法

        编写Android.mk文件,让NDK在build的时候去找第三方库,把它拷到libs/armeabi目录下。

        网上找了一通,发现好些博文都说在jni目录下新建prebuilt目录,再把第三方库拷进prebuilt目录下,并且在prebuilt目录下新建并编写Android.mk,而后再jni目录下引用prebuilt里的库……云云。照着捣鼓了一番,还是——臣妾做不到啊!!

不过有些博文指出,NDK的官方文档有这方面指南,就在ndk目录的docs子目录下。我的ndk版本(android-ndk-r10d)里,Prebuilt Libraries这一章节在./docs/Programmers_Guide/html/md_3__key__topics__libraries__p_r_e_b_u_i_l_t_s.html这里。

        有了官方文档的解释,基本也就清楚了。以libBaiduMapSDK.so库为例,首先在jni目录下新建一个prebuilt文件夹(名字任取),然后把第三方库拷进去。接下来打开在jni 目录下的Android.mk文件,声明预编译库模块:

include $(CLEAR_VARS)
LOCAL_MODULE := BaiduMapSDK #模块名称
LOCAL_SRC_FILES := prebuilt/libBaiduMapSDK.so #注意加prebuilt/,这样才能找到libBaiduMapSDK.so
include $(PREBUILT_SHARED_LIBRARY)

        引用BaiduMapSDK模块:

LOCAL_SHARED_LIBRARIES := liblog libcutils \
                                 BaiduMapSDK #就是上边声明的那个模块

        这样ndk-build完之后,你就可以在libs/armeabi下看到libBaiduMapSDK.so了:D


3. 后话

  • Prebuilt Libraries更详尽的解释,请参考官方文档。
  • 别人的解决办法:(不保证可行 :P)

Android项目使用外部.so - prebuild library on android

android开发---ndk-build不自动删除外部库 

关于Android NDK中调用第三方的动态库


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值