我在堆栈溢出时已经阅读了与此类似的其他问题,但它们没有相同的情况。
我有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)
答案 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中使用lib1
或lib2
中的任何符号,它们将在链接时被删除。为了防止这种情况发生,LOCAL_WHOLE_STATIC_LIBRARIES
添加以下选项以链接行以确保不剥离符号:
-Wl,--whole-archive -llib1 -llib2 -Wl,--no-whole-archive
我的博客文章中的更多信息:http://gosuwachu.io/
答案 1 :(得分:0)
这是完全正确的,但你似乎对概念感到困惑。正如您所期望的那样,您的静态库不包含在您的共享库中。您的静态库只链接到共享库。最后,你的程序需要一个.so文件和一个.a才能正常运行,而不仅仅是一个包含所有内容的大文件。