android 使用动态库或静态库来编译生成动态库

本文介绍了如何在Android项目中使用静态库(.a)和动态库(.so)来构建动态库。通过修改Android.mk文件,详细展示了从A项目生成静态库并集成到B项目,以及直接使用动态库构建B项目的过程。同时提醒注意加载顺序和预编译库的使用,以及可能遇到的找不到符号的问题。

使用静态库来编译动态库

例如项目A产生静态库testa.a, 项目B需要用testa.a生成动态库testb.so

A项目的android.mk文件:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := testa
LOCAL_SRC_FILES := testa.c
include $(BUILD_STATIC_LIBRARY)


生成的testa.a静态库加入编译系统的库文件目录中,比如我是用android-8(2.2)版本进行编译的, 所以testa.a文件放入:

E:\workspace\android-ndk-r8e\platforms\android-8\arch-arm\usr\lib\下面


项目B的android.mk文件:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_LDLIBS := -ltesta
LOCAL_STATIC_LIBRARIES := libtesta


LOCAL_MODULE    := testb
LOCAL_SRC_FILES := testb.c


include $(BUILD_SHARED_LIBRARY)


这样生成的libtestb.so中已经包括了libtesta.a静态库, 在java文件中只需要 System.loadLibrary("testb");即可




使用动态库来编译动态库

A项目的android.mk文件如下:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := testa
LOCAL_SRC_FILES := testa.c
include $(BUILD_SHARED_LIBRARY)


生成的libtesta.so加入到E:\workspace\android-ndk-r8e\platforms\android-8\arch-arm\usr\lib\下面


项目B的文件目录结构如下:

jni

jni/jni/

jni/prebuilt/

jni目录下的mk文件如下:

include $(all-subdir-makefiles)

jni/prebuilt目录下的mk文件如下:

LOCAL_PATH := $(call my-dir)


#include $(CLEAR_VARS)
LOCAL_MODULE := libtesta
LOCAL_SRC_FILES := libtesta.so
include $(PREBUILT_SHARED_LIBRARY)

同时把libtesta.so也放入该目录下.


jni/jni目录下的mk文件内容:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_LDLIBS := -ltesta

LOCAL_MODULE    := testb
LOCAL_SRC_FILES := testb.c


include $(BUILD_SHARED_LIBRARY)


这样生成libtestb.so文件, 同时eclipse在打包时会把libtesta.so, libtestb.so都加入到apk文件中,如果没有prebuilt那一步,那么在打包时会漏掉libtesta.so, 但编译会通过,因为编译读取的是编译系统的库文件目录(LOCAL_LDLIBS := -ltesta), 这点需要注意

java代码:

System.loadLibrary("testa");

System.loadLibrary("testb");

注意先后关系




2013-12-23日添加

经过测试, 发现使用使用动态库来编译动态库的方法有时会出现问题,一直找不到符号

可以用以下方法编译:

假设A项目生产的so文件为:libffmpeg-neon.so

在E:\android_ffmpeg\share\ffmpeg目录下加入libffmpeg-neon.so文件, 再加入android.mk文件, 内容为:

LOCAL_PATH := $(call my-dir)


include $(CLEAR_VARS)
LOCAL_MODULE := ffmpeg-neon
LOCAL_SRC_FILES := libffmpeg-neon.so
include $(PREBUILT_SHARED_LIBRARY)


项目B的android.mk文件样本为:

LOCAL_PATH := $(call my-dir)


include $(CLEAR_VARS)


LOCAL_MODULE    := hello-jni
LOCAL_C_INCLUDES += $(LOCAL_PATH)/ffmpeg-2.0.2 \
                    $(LOCAL_PATH)/ffmpeg-2.0.2/libavutil \
                    $(LOCAL_PATH)/ffmpeg-2.0.2/libavcodec \
                    $(LOCAL_PATH)/ffmpeg-2.0.2/libavformat \
                    $(LOCAL_PATH)/ffmpeg-2.0.2/libavcodec \
                    $(LOCAL_PATH)/ffmpeg-2.0.2/libswscale \
                    $(LOCAL_PATH)/jniffmpeg-2.0.2 \
                    $(LOCAL_PATH)
LOCAL_SRC_FILES := hello-jni.c
LOCAL_LDLIBS := -llog -lz -lm
LOCAL_SHARED_LIBRARIES := ffmpeg-neon


include $(BUILD_SHARED_LIBRARY)


$(call import-module,ffmpeg)

然后项目B的构建命令为:

E:\workspace\android-ndk-r8e\ndk-build.cmd NDK_DEBUG=1 V=1 NDK_MODULE_PATH=E:/android_ffmpeg/share/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值