2011-06-22 67 views
8

我想構建一個使用一些現有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文檔。謝謝!

+0

我不太確定這是個好主意。如果你建立一個完全靜態鏈接的庫,它依賴於libstdC++,那麼你最終會在庫中包含這些函數的副本。但是當你在手機上加載這個庫時,你將會把它加載到一個已經有一個libstdC++共享映射的進程中,這個映射是應用程序從zygote分離出來時繼承的。這至少是浪費。使用構建標誌允許庫具有不滿意的依賴關係可能更好? –

回答

1

我遇到了同樣的問題,並通過爲標準C++庫添加模塊來解決此問題。由ndk-build系統鏈接的庫來自錯誤的位置(在我的例子中是platforms/android-9/arch-arm/usr/lib)。

include $(CLEAR_VARS) 
LOCAL_MODULE := rightstdc 
LOCAL_SRC_FILES := <path to the correct libstdc++.a> 
include $(PREBUILT_STATIC_LIBRARY) 

模塊標籤添加到靜態庫的名單:

LOCAL_STATIC_LIBRARIES := engine shmem util rightstdc 

build/core/build-binary.mk預規劃-L$(SYSROOT)/usr/lib如果LOCAL_LDLIBS但對我來說這是錯誤的路徑指定的任何庫。

我不知道是否有一個缺失的步驟,應該將正確的libstdC++複製到該位置,但上述方法將工作。

+0

在Application.mk中添加您的C++庫相關信息以及一些cpp標誌 –

3

嘛,你其實可以解決與創建Application.mk文件相同的文件夾內的文件Android.mk是,包含:

APP_STL := stlport_static 

使用位於內的靜的STLport Android NDK。