Android将许多静态库链接到共享库

时间:2014-01-27 12:15:56

标签: android-ndk ffmpeg libx264

我有4个静态库libavcodec.a libavutil.a libswscale.a libx264.a

我想将其与libmytest.so

相关联

我在Android.mk脚本下面尝试了

LOCAL_PATH := $(call my-dir)
INITIAL_PATH := $(LOCAL_PATH)

include $(CLEAR_VARS)
LOCAL_MODULE := mytest

LOCAL_SRC_FILES := mytest.c

LOCAL_LDLIBS += -llog
LOCAL_WHOLE_STATIC_LIBRARIES := libavutil libavcodec libswscale libx264

include $(BUILD_SHARED_LIBRARY)

mytest.c从这些库中调用许多函数。这4个库放在PROJECTPATH\jni\内。

但我得到undefined reference来自这些库的所有函数。

我尝试了LOCAL_ALLOW_UNDEFINED_SYMBOLS := true允许我创建共享库,但是当我启动应用程序时,我得到了

01-22 07:15:15.650: E/AndroidRuntime(9655): Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: reloc_library[1285]:  1868 cannot locate 'avcodec_register_all'...
01-22 07:15:15.650: E/AndroidRuntime(9655):     at java.lang.Runtime.loadLibrary(Runtime.java:370)
01-22 07:15:15.650: E/AndroidRuntime(9655):     at java.lang.System.loadLibrary(System.java:535)

1 个答案:

答案 0 :(得分:3)

如果不从源代码构建库,则需要为每个库定义PREBUILT_STATIC_LIBRARY,例如。

include $(CLEAR_VARS)
LOCAL_MODULE := avutil
LOCAL_SRC_FILES := $(LOCAL_PATH)/jni/libavutil.a
include $(PREBUILT_STATIC_LIBRARY)

...   [重复其他预建库]。

LOCAL_STATIC_LIBRARIES只能理解模块名称,即stuff that have been declared through their own ndk-build module definition的名称。我很惊讶它没有提供有关丢失模块的警告,但这是与你的问题相对应的最可能的解释。