簡體   English   中英

使用預構建的靜態庫進行Android NDK開發

[英]using pre-built static libraries for Android NDK development

我正在嘗試構建一個使用一些現有c ++代碼中的靜態庫的android應用程序。 但是我似乎無法使事情建立起來,這是我到目前為止已采取的步驟。

我有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/

這是編譯時從makefile生成的示例行:

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

接下來,我使用ndk-build使用以下Android.mk來構建應用程序:

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 ndk中提供的獨立工具鏈編譯器進行精細編譯。 但是,使用ndk-build將共享庫鏈接到預構建庫時,有許多未解決的對ostream的引用。 例如:

/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*)'

我認為我在使用獨立編譯器進行編譯時會丟失一些重要的標志或未做正確的事情,但是對此問題的任何幫助或見解將不勝感激,因為我似乎無法在Google或任何Android NDK中找到此答案文檔。 謝謝!

好的,您可以通過在與Android.mk文件相同的文件夾中創建Application.mk文件來解決此問題,該文件包含:

APP_STL := stlport_static

用於使用位於Android NDK內的靜態stlport。

我遇到了同樣的問題,並通過為標准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

如果在LOCAL_LDLIBS中指定了任何庫,則build/core/build-binary.mk加上-L$(SYSROOT)/usr/lib ,但是在我的情況下,這是錯誤的路徑。

我不知道是否有缺少的步驟應該將正確的libstdc ++復制到該位置,但是上面的方法會起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM