我想用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却找不到差异。 什么是差异???
答案 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)链接到共享库或可执行文件时,您会看到大小差异。