从静态库* .a文件构建共享库

时间:2013-09-19 07:49:34

标签: android c++ android-ndk shared-libraries static-libraries

我在堆栈溢出时已经阅读了与此类似的其他问题,但它们没有相同的情况。

我有FreeImage.a(23 MB文件)文件,它为android预先编译静态库。 我还有FreeImage Project的源代码,它有头文件。

我想用我的JNI代码(FreeImageCompilation.cpp)从( .a)文件构建 .SO文件 下面的代码编译很好,但它确实生成了(只有5KB)的SO文件(* .a文件是23 MB)?

有人可以检查下面的代码是否正确使用* .a文件?

在我的Android.mk中,我有以下代码。

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := FreeImage
LOCAL_SRC_FILES := libFreeImage.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/FreeImage/Source/
include $(PREBUILT_STATIC_LIBRARY)

#My Own SO file

LOCAL_STATIC_LIBRARIES := FreeImage
include $(CLEAR_VARS)
LOCAL_MODULE    := FreeImageSo
LOCAL_SRC_FILES := FreeImageCompilation.cpp
LOCAL_STATIC_LIBRARIES := FreeImage
include $(BUILD_SHARED_LIBRARY)

2 个答案:

答案 0 :(得分:2)

要回答标题中的问题,以下是如何从静态库创建共享库:

# static library 1
include $(CLEAR_VARS)
LOCAL_MODULE := lib1
LOCAL_SRC_FILES := lib1.cpp
include $(BUILD_STATIC_LIBRARY)

# static library 2
include $(CLEAR_VARS)
LOCAL_MODULE := lib2
LOCAL_SRC_FILES := lib2.cpp
include $(BUILD_STATIC_LIBRARY)

# this shared library will have all symbols from two above libraries
include $(CLEAR_VARS)
LOCAL_MODULE := lib_shared
LOCAL_SRC_FILES := empty.cpp
LOCAL_WHOLE_STATIC_LIBRARIES := lib1 lib2
include $(BUILD_SHARED_LIBRARY)

需要注意的重要选项是LOCAL_WHOLE_STATIC_LIBRARIES。如果您使用常规LOCAL_STATIC_LIBRARIES,因为您不在lib_shared中使用lib1lib2中的任何符号,它们将在链接时被删除。为了防止这种情况发生,LOCAL_WHOLE_STATIC_LIBRARIES添加以下选项以链接行以确保不剥离符号:

-Wl,--whole-archive -llib1 -llib2 -Wl,--no-whole-archive

我的博客文章中的更多信息:http://gosuwachu.io/

答案 1 :(得分:0)

这是完全正确的,但你似乎对概念感到困惑。正如您所期望的那样,您的静态库不包含在您的共享库中。您的静态库只链接到共享库。最后,你的程序需要一个.so文件和一个.a才能正常运行,而不仅仅是一个包含所有内容的大文件。