我想構建一個使用一些現有C++代碼的靜態庫的android應用程序。然而,我似乎無法得到的東西建設,這裏是我已採取的步驟迄今..使用預構建的Android NDK開發的靜態庫
我有ndk-r5b,並建立了獨立的工具鏈ndk/docs/STANDALINE-TOOLCHAIN.html。然後,我使用了獨立的工具鏈編譯器(arm-linux-androideabi-g ++)而不是g ++來編譯我需要的靜態庫的Makefile中的CXX標誌。這個編譯沒有錯誤,並且有3個靜態庫生成。 下面是一些用於構建預編譯庫中的標誌的代碼片斷:
CXX = arm-linux-androideabi-g++
SYSTEM_LIBS = -lstdc++ -lm
INCLUDE_PATH += ${NDK_PATH}/platforms/android-8/arch-arm/usr/include/
這裏是從生成文件編譯時產生的樣本行:
arm-linux-androideabi-g++ -c -DTIME_SIM -I./include -I/home/greg/dev/Android/android-ndk-r5b/platforms/android-8/arch-arm/usr/include/ -fpic -ggdb3 -SimTime.C -o SimTime.o
接着我建立預建庫編譯罰款使用的雄給出獨立的工具鏈編譯
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := engine
LOCAL_SRC_FILES := ../libs/libEngine.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := shmem
LOCAL_SRC_FILES := ../libs/libShMem.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := util
LOCAL_SRC_FILES := ../libs/libUtil.a
include $(PREBUILT_STATIC_LIBRARY)
# build server as a shared library
include $(CLEAR_VARS)
LOCAL_MODULE := libServer
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../include
LOCAL_SRC_FILES := \
Server.C \
Router.C \
RouterMsgs.C \
Federation.C \
cripName.C \
ver.C \
JNIWrapper.cpp
LOCAL_STATIC_LIBRARIES := engine shmem util
include $(BUILD_SHARED_LIBRARY)
:使用Android.mk以下使用NDK,構建應用程序id ndk。但是,當使用ndk-build將共享庫鏈接到預建庫時,有很多未解析的對ostream的引用。對於exampe:
/home/android/obj/local/armeabi/libShMem.a(SubscriptionItem.o): In function `SUBSCRIPTION_ITEM::Print(std::basic_ostream<char, std::char_traits<char> >&)':/home/src/comm/SubscriptionItem.C:97: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
我認爲我缺少一些重要的標誌或沒有做一些正確的,當我使用的是獨立的編譯器,但在這個問題上的任何幫助或洞察力將不勝感激編譯,因爲我似乎無法找到這個回答在谷歌或在任何Android ndk文檔。謝謝!
我不太確定這是個好主意。如果你建立一個完全靜態鏈接的庫,它依賴於libstdC++,那麼你最終會在庫中包含這些函數的副本。但是當你在手機上加載這個庫時,你將會把它加載到一個已經有一個libstdC++共享映射的進程中,這個映射是應用程序從zygote分離出來時繼承的。這至少是浪費。使用構建標誌允許庫具有不滿意的依賴關係可能更好? –