2013-03-13 80 views
20

我想在我的android應用程序內使用NDK提升庫。我找到了幾個成功案例herehere,但我不能對我說同樣的話。我正在嘗試使用this link中的庫以及boost線程庫。在下面的代碼中,我只是試圖包含線程庫,而不是數學庫。我用來構建boost庫的過程與我附加的第一個鏈接非常相​​似。Android NDK:包括提升C++庫

到目前爲止,似乎我已經成功地構建了Boost庫,但是當我運行ndk-build,我得到以下錯誤:

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

顯然cp: omitting directory...不完全是一個錯誤。但除此之外,我唯一得到的是下一行,這並不意味着什麼。 Error 1

這是我的Android.mk文件:

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) 

而且也有在path/to/ndk/sources/boost/一個Android.mk文件:

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) 

而我卑微的Application.mk文件:

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

我使用bjam構建了boost庫。所有libboost_###.a文件位於sources/boost/android/lib文件夾中。

我得到的錯誤是什麼?

+1

幾乎所有關於安裝,編譯的信息都在這裏討論 [官方的「Boost library」支持Android和iOS? ](http://stackoverflow.com/questions/14036311/official-boost-library-support-for-android-and-ios) – RDX 2013-03-14 12:08:11

回答

11

我使用Boost-for-Android構建了boost庫。然後,我在我的升壓/包括/ lib目錄中的Android makefile文件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) 

和我的模塊在這裏我使用一些Boost庫的看起來像這樣

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) 

另外我有一個Android.mk所有子目錄的makefile列出

TOP_PATH := $(call my-dir) 

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

和我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

謝謝!這絕對是非常有幫助的。 – conciliator 2013-11-13 13:22:00

+0

我嘗試了你的方法,並且失敗了(在jni/Android.mk中包含BUILD_SHARED_LIBRARY之前缺少LOCAL_MODULE)。我正在使用也提升1_53)。 – 4ndro1d 2014-05-20 11:05:16

0

這裏:http://silverglint.com/boost-for-android/你可以找到一個簡單而無痛的新方法來構建一個現代(例如1.64.0)的Android版本。 適用於clang和gcc。

還包括一個示例應用程序,向您展示如何使用由此構建的增強二進制文件。