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

Android 从静态库*.a文件构建共享库,android,c++,android-ndk,shared-libraries,static-libraries,Android,C++,Android Ndk,Shared Libraries,Static Libraries,我已经读过关于堆栈溢出的其他类似问题,但它们并没有相同的场景 我有一个FreeImage.a(23MB文件)文件,它预编译了android的静态库。 我也有FreeImage项目的源代码,它有头文件 我想使用JNI代码(freeMageCompilation.cpp)从(.a)文件中构建.SO文件 下面的代码编译得很好,但它确实生成了(仅5KB)的文件(*.a文件是23MB) 有人能检查我下面使用*.a文件的代码是否正确吗 在我的Android.mk中,我有以下代码 LOCAL_PATH :=

我已经读过关于堆栈溢出的其他类似问题,但它们并没有相同的场景

我有一个FreeImage.a(23MB文件)文件,它预编译了android的静态库。 我也有FreeImage项目的源代码,它有头文件

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

有人能检查我下面使用*.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)

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

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

# 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\u STATIC\u库
,因为您没有在lib\u shared中使用
lib1
lib2
中的任何符号,它们将在链接时被剥离。为了防止这种情况发生,本地\u整个\u静态\u库在链接行中添加了以下选项,以确保符号不会被剥离:

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

更多信息请参见我的博客:

这意味着编译的SO文件是正确的,我需要放置。*。根据WinGDB网站的说法:“静态库是一个实用程序库,可以用作创建共享库的组件。它不在apk文件中,也没有安装到设备上。Java代码无法在运行时加载它。静态库构建为{output dir}/obj/local/{ABI name}”文件夹。这也是共享库的中间文件夹,但是后者会自动复制到它们在{output dir}/libs/{ABI name}中的最终目标。静态库保留在中间文件夹中,链接器可以在其中构建共享库。”因此,您不必将.a文件放入APK。这应该在链接过程中处理。