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

被折叠的 条评论
为什么被折叠?



