2013-03-13 40 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。

还包括一个示例应用程序,向您展示如何使用由此构建的增强二进制文件。