NDK重新编译so库

本文详细介绍了如何在Android环境下使用NDK对已存在的SO动态库进行重新编译的过程,首先通过test2.cpp生成libhello.so,然后在源文件目录下进行二次编译。关键步骤涉及到了Android.mk文件的配置。

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

先用test2.cpp生成libhello.so,将该库放在源文件目录下,然后对该库进行再次编译,android.mk文件如下格式:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := foo-prebuilt
LOCAL_SRC_FILES := libhello.so
#LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := foo-user
LOCAL_SRC_FILES := test.cpp
LOCAL_LDLIBS := -llog
LOCAL_SHARED_LIBRARIES := foo-prebuilt
include $(BUILD_SHARED_LIBRARY)

-----------------------------------------------------------------------------------
Application.mk文件如下:
APP_ABI := armeabi-v7a
APP_STL := gnustl_static

之后执行ndk-build即可,最终在armeabi-va7文件夹就会生成如上图的两个库了

如果想导出libhello的头文件加上LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include

ps:在libs目录下放入两个SO文件,在java调用System.loadLibrary加载foo-user.so一个即可实现调用libhello.so的方法
多个*.so文件不能直接合并,因为其中已经没有重定向信息。但多个静态库文件是可以合并成一个动态库文件的。 

LOCAL_SHARED_LIBRARIES: 

表示模块在运行时要依赖的共享库(动态库),在链接时就需要,以便在生成文件时嵌入其相应的信息。

LOCAL_LDLIBS: 

编译模块时要使用的附加的链接器选项。这对于使用‘-l’前缀传递指定库的名字是有用的。

没想到动态库在Android中有两种链接方式。

Application.mk; 加入 APP_STL :=  stlport_static  右边的值还可以换成下面几个:

system - 使用默认最小的C++运行库,这样生成的应用体积小,内存占用小,但部分功能将无法支持

stlport_static - 使用STLport作为静态库,这项是Android开发网极力推荐的

stlport_shared - STLport 作为动态库,这个可能产生兼容性和部分低版本的Android固件,目前不推荐使用。

gnustl_static  - 使用 GNU libstdc++ 作为静态库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值