Search code examples
c++android-ndkgnuvisualgdb

What is the difference between gnustl_shared and gnustl_static in Android NDK library .a file?


I want to create android library using c++ stl.

my build tools are visual studio 2015, Visual GDB.

source code is

.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

I succeed build, so, created lib files libAndroidProject2-static.a, libAndroidProject2-static.so

than, I try to change APP_STL option in Application.mk

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

surely, succeed build. so, created lib files libAndroidProject2-shared.a, libAndroidProject2-shared.so

than, I Compare it and previous build outputs.

I Found the difference about .so file. gnustl_static option's .so file is more bigger than gnustl_shared option's it. but .a is same.

why? I used nm, readelf but can't find difference. what is diff???


Solution

  • There are two questions here:

    Why does using gnustl_static make larger shared libraries than gnustl_shared?

    When you use a static library you're including code from that library directly into your shared library, so your library grows. When you use a shared library you load the code that would have been included from the other shared library instead of including it. The size you need to compare is libAndroidProject2-static.so + libgnustl_shared.so, since both must be present at runtime.

    Why didn't using gnustl_static make a larger static library?

    Static libraries (libAndroidProject2-static.a, in this case) aren't linked; they're just archives of the compiled sources. libgnustl_static.a doesn't get included until you actually link libAndroidProject-static.a into something, at which point you'll also need to link libgnustl_static.a.

    You'd see the size difference when you linked libAndroidProject2-static.a (and libgnustl_static.a) into a shared library or exeuctable.