Android NDK库.a文件中gnustl_shared和gnustl_static有什么区别?

时间:2017-03-29 09:06:17

标签: c++ android-ndk gnu visualgdb

我想用c ++ stl。

创建android库

我的构建工具是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,libAndroidProject2-static.so

,我尝试更改Application.mk中的APP_STL选项

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却找不到差异。 什么是差异???

2 个答案:

答案 0 :(得分:0)

不同之处在于当你使用static时,std的代码被编译成结果.so文件,同时使用shared,导致文件需要在单独的文件中有std

答案 1 :(得分:0)

这里有两个问题:

为什么使用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)链接到共享库或可执行文件时,您会看到大小差异。