Я хочу создать библиотеку Android с использованием C ++ STL.
Мои инструменты сборки 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
чем, я пытаюсь изменить параметр 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 файла. Файл .so опции gnustl_static больше, чем опция gnustl_shared.
но .а то же самое.
Зачем?
Я использовал nm, readelf, но не могу найти разницу.
что такое diff ???
Здесь есть два вопроса:
Почему использование gnustl_static создает большие разделяемые библиотеки, чем gnustl_shared?
Когда вы используете статическую библиотеку, вы включаете код из этой библиотеки непосредственно в общую библиотеку, и ваша библиотека растет. Когда вы используете общую библиотеку, вы загружаете код, который был бы включен из другой общей библиотеки, вместо того, чтобы включать ее. Размер, который нужно сравнить, это libAndroidProject2-static.so + libgnustl_shared.so, так как оба должны присутствовать во время выполнения.
Почему использование gnustl_static не сделало большую статическую библиотеку?
Статические библиотеки (в данном случае libAndroidProject2-static.a) не связаны; это просто архивы скомпилированных источников. libgnustl_static.a не будет включен, пока вы не свяжете libAndroidProject-static.a с чем-то, после чего вам также нужно будет связать libgnustl_static.a.
Вы увидели бы разницу в размере, когда связали libAndroidProject2-static.a (и libgnustl_static.a) в общую библиотеку или в execctable.
Разница в том, что когда вы используете static
код std компилируется в результирующий файл .so при использовании shared
В результате файл так должен иметь STD в отдельном файле так