Android NDK库.a文件中gnustl_shared和gnustl_static之间的区别是什么?

问题描述:

我想用C++ stl创建android库。Android NDK库.a文件中gnustl_shared和gnustl_static之间的区别是什么?

我的构建工具是visual studio 2015,Visual GDB。

源代码是

的.cpp

#include <jni.h> 
#include "AndroidProject2.h" 
#include <vector> 
void foo() { std::vector<int> aaa; aaa.push_back(1); } 

Android.mk

# Generated by VisualGDB 
LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_MODULE := AndroidProject2-shared 
LOCAL_SRC_FILES := AndroidProject2.cpp 
COMMON_SRC_FILES := $(LOCAL_SRC_FILES) 
include $(BUILD_SHARED_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := AndroidProject2-static 
LOCAL_SRC_FILES := $(COMMON_SRC_FILES) 
include $(BUILD_STATIC_LIBRARY) 

Application.mk

APP_MODULES := AndroidProject2-static AndroidProject2-shared 
APP_ABI := all 
APP_STL := gnustl_static 
NDK_TOOLCHAIN_VERSION :=4.9 

我成功构建,因此,创建LIB文件libAndroidProject2 -static.a,l ibAndroidProject2-static.so

比,我试图改变APP_STL选项Application.mk

APP_MODULES := AndroidProject2-static AndroidProject2-shared 
APP_ABI := all 
APP_STL := gnustl_shared 
NDK_TOOLCHAIN_VERSION :=4.9 

肯定,成功构建。所以,创建lib文件libAndroidProject2-shared.a,libAndroidProject2-shared.so

比,我比较它和以前的构建输出。

我发现了关于.so文件的区别。 gnustl_static选项的.so文件比gnustl_shared选项更大。 但是.a是一样的。

为什么? 我用nm,readelf但是找不到差别。 什么是差距?

+0

如果您只为Android项目创建一个共享库,则可以使用其中一个。如果您的Android项目由多个共享库组成,您将需要使用共享版本。 –

有两个问题在这里:

为什么使用gnustl_static比gnustl_shared创建更大的共享库?

当您使用静态库时,您将库中的代码直接包含到共享库中,因此您的库会增长。当您使用共享库时,您将加载其他共享库中包含的代码,而不是将其包含在内。您需要比较的大小是libAndroidProject2-static.so + libgnustl_shared.so,因为两者都必须在运行时存在。

为什么不使用gnustl_static创建一个更大的静态库?

静态库(libAndroidProject2-static.a,在本例中)未链接;他们只是编译源代码的档案。直到你真正将libAndroidProject-static.a链接到某个东西,libgnustl_static.a才会被包含,此时你还需要链接libgnustl_static.a。

将libAndroidProject2-static.a(和libgnustl_static.a)链接到共享库或可执行文件时,您会看到大小差异。

+0

也就是说,“.a文件总是静态库,即使它添加了选项APP_STL:= gnustl_shared。” 对不对? – user3416447

+0

是的,这就是.a的意思。 –

不同的是,当你使用static,性病的代码被编译到生成的.so文件,同时采用shared,从而使文件需要有独立的性病因此文件