2017-03-29 57 views
0

我想用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項目由多個共享庫組成,您將需要使用共享版本。 –

回答

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)鏈接到共享庫或可執行文件時,您會看到大小差異。

+0

也就是說,「.a文件總是靜態庫,即使它添加了選項APP_STL:= gnustl_shared。」 對不對? – user3416447

+0

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

0

不同的是,當你使用static,性病的代碼被編譯到生成的.so文件,同時採用shared,從而使文件需要有獨立的性病因此文件

相關問題