2013-03-13 13 views
20

Ich versuche, eine Boost-Bibliothek in meiner Android-Anwendung zu verwenden, mit dem NDK. Ich habe ein paar Erfolgsgeschichten gefunden here und here, aber ich kann nicht dasselbe über mich sagen. Ich versuche speziell, die Bibliothek in this link sowie die Boost-Thread-Bibliothek zu verwenden. Im folgenden Code versuche ich nur, die Thread-Bibliothek und nicht die Math-Bibliothek einzuschließen. Der Prozess, den ich verwendet habe, um die Boost-Bibliotheken zu erstellen, ist ziemlich genau der gleiche wie der erste Link, den ich angehängt habe.Android NDK: Einschließlich Boost C++ - Bibliothek

Bisher scheint es, ich erfolgreich die Boost-Bibliotheken gebaut haben, aber wenn ich ndk-build laufen lasse, erhalte ich folgende Fehlermeldung:

Prebuilt  : libboost_thread.a <= <NDK>/sources/ 
cp: omitting directory `path/to/ndk/sources/boost' 
make: *** [obj/local/armeabi/libboost_thread.a] Error 1 

Offensichtlich ist die cp: omitting directory... ist nicht gerade ein Fehler auf. Aber das Einzige, was ich bekomme, ist die nächste Zeile, die eigentlich gar nichts bedeutet. Error 1

Hier ist meine Android.mk Datei:

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_STATIC_LIBRARIES := boost_thread 
LOCAL_LDLIBS := lboost_system-gcc-md lboost_thread-gcc-md -lgnustl_static 
LOCAL_LDLIBS += lboost_system-gcc-md lboost_thread-gcc-md \ 
     -L$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi \ 
     -lgnustl_static 
LOCAL_SRC_FILES := #cpp_sources 
LOCAL_MODULE := com_example_ndkFile_CppMethods 
include $(BUILD_SHARED_LIBRARY) 
$(call import-module,boost) 

Und es gibt auch eine Android.mk Datei in path/to/ndk/sources/boost/:

LOCAL_PATH:= $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_MODULE:= boost_thread 
LOCAL_SRC_FILES:= android/lib/libboost_thread.a 
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH) 
include $(PREBUILT_STATIC_LIBRARY) 

Und meine bescheidene Application.mk Datei:

APP_ABI := armeabi armeabi-v7a 
APP_STL := gnustl_static 
APP_CPPFLAGS = -fexceptions 

Ich baute die Boost-Bibliotheken mit bjam. Alle libboost_###.a Dateien befinden sich im Ordner sources/boost/android/lib.

Was ist der Fehler, den ich bekomme?

+1

Fast alle Informationen zur Installation, Kompilierung ist hier abgedeckt [Offizielle "Boost-Bibliothek" Support für Android und iOS? ] (http://stackoverflow.com/questions/14036311/official-boost-library-support-for-android-and-ios) – RDX

Antwort

11

Ich baute die Boost-Bibliotheken mit Boost-for-Android. Dann habe ich in meiner boost haben/include/lib der Androide Make-Datei boost.mk

LOCAL_PATH := $(call my-dir) 

# boost_date_time 
# 
include $(CLEAR_VARS) 
LOCAL_MODULE := boost_date_time 
LOCAL_SRC_FILES := libboost_date_time-gcc-mt-1_53.a 
include $(PREBUILT_STATIC_LIBRARY) 

# boost_filesystem 
# 
include $(CLEAR_VARS) 
LOCAL_MODULE := boost_filesystem 
LOCAL_SRC_FILES := libboost_filesystem-gcc-mt-1_53.a 
include $(PREBUILT_STATIC_LIBRARY) 

# boost_thread 
# 
include $(CLEAR_VARS) 
LOCAL_MODULE := boost_thread 
LOCAL_SRC_FILES := libboost_thread-gcc-mt-1_53.a 
include $(PREBUILT_STATIC_LIBRARY) 

# boost_system 
# 
include $(CLEAR_VARS) 
LOCAL_MODULE := boost_system 
LOCAL_SRC_FILES := libboost_system-gcc-mt-1_53.a 
include $(PREBUILT_STATIC_LIBRARY) 

# boost_program_options 
# 
include $(CLEAR_VARS) 
LOCAL_MODULE := boost_program_options 
LOCAL_SRC_FILES := libboost_program_options-gcc-mt-1_53.a 
include $(PREBUILT_STATIC_LIBRARY) 

# boost_chrono 
# 
include $(CLEAR_VARS) 
LOCAL_MODULE := boost_chrono 
LOCAL_SRC_FILES := libboost_chrono-gcc-mt-1_53.a 
include $(PREBUILT_STATIC_LIBRARY) 

und mein Modul, wo ich wie folgt aussieht Ich habe einige der Boost-Bibliotheken verwenden ein

LOCAL_PATH := $(call my-dir) 

# SignalServer, executable 
# 
include $(CLEAR_VARS) 
LOCAL_CFLAGS   := -DTIXML_USE_TICPP 
#LOCAL_CFLAGS   += -DDEBUG 
LOCAL_STATIC_LIBRARIES := boost_thread \ 
    boost_system \ 
    boost_filesystem \ 
    boost_program_options \ 
    boost_chrono \ 
LOCAL_STATIC_LIBRARIES += ticpp \ 
    tia \ 
    tobicore \ 
    tobiid \ 
    tid \ 
    gdf 
LOCAL_MODULE   := signalserver 
LOCAL_C_INCLUDES  := $(LOCAL_PATH)/include 
LOCAL_C_INCLUDES  += $(LOCAL_PATH)/extern/include 
LOCAL_C_INCLUDES  += $(LOCAL_PATH)/../boost/include/boost-1_53 
LOCAL_SRC_FILES  := #cpp source 

include $(BUILD_EXECUTABLE) 

zusätzlich Android.mk wo alle subdir Makefiles aufgelistet

TOP_PATH := $(call my-dir) 

include $(TOP_PATH)/boost/lib/boost.mk 
include $(TOP_PATH)/signalserver/signalserver.mk 
. 
. 

und meine Application.mk:

APP_PLATFORM   := android-14 
APP_ABI    := armeabi-v7a 
#APP_OPTIM    := debug 
#NDK_DEBUG    := 1 

NDK_TOOLCHAIN_VERSION := 4.6 
APP_STL    := gnustl_static 
APP_CPPFLAGS   := -fexceptions -frtti 
+0

Danke! Das ist definitiv sehr hilfreich. – conciliator

+0

Ich versuchte Ihren Ansatz und es schlägt fehl (Missing LOCAL_MODULE vor dem Einbinden von BUILD_SHARED_LIBRARY in jni/Android.mk). Ich benutze auch Boost 1_53). – 4ndro1d

0

Hier: http://silverglint.com/boost-for-android/ können Sie eine einfache und schmerzlose neue Möglichkeit finden, eine moderne (zB 1.64.0) Boost-Version für Android zu bauen. Funktioniert mit clang und gcc.

Ebenfalls enthalten ist eine Beispiel-App, die Ihnen zeigt, wie Sie die Boost-Binaries verwenden.

Verwandte Themen