更新: Android 上的 std::atomic 似乎存在问题,并且由于 Boost.Asio 正在使用它(默认情况下),结合线程,偶尔会出现死锁。幸运的是,Boost.Asio 使得从 Std.Atomic 切换到 Boost.Atomic 变得很容易,并且在本次提交的Boost-for-Android项目中已经解决了这一点。
有关该错误的更多信息,请参见此处
我们正在使用 boost asio 为 Android 开发一个简单的多人游戏(尚未发布),到目前为止我们没有任何问题。这就是问题#2。
你看到什么样的问题?
如果问题与编译和链接有关,也许这些提示会很有用。
将以下内容添加到您的 AndroidManifest.xml 文件中:
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
在你的 Application.mk 文件中有这个:
APP_STL := gnustl_static
APP_CPPFLAGS += -frtti -fexceptions
并将其用作您的 Android.mk 文件的模板:
LOCAL_PATH := $(call my-dir)
BOOST_VERSION := 1_49
PROJECT_ROOT := $(LOCAL_PATH)/../../../..
BOOST_INCLUDE_PATH := /path/to/boost/headers
BOOST_LIB_PATH := /path/to/boost/libraries
# Path and name of the STL library. Add this to the *end* of LOCAL_LDLIBS.
# Note this is a hack/workaround to prevent linker errors when compiling with
# boost.
STL_LIBS := -L$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi \
-lgnustl_static
include $(CLEAR_VARS)
LOCAL_MODULE := native-activity
LOCAL_C_INCLUDES:= $(BOOST_INCLUDE_PATH) \
$(PROJECT_ROOT)/src \
$(PROJECT_ROOT)/platform/android/jni
LOCAL_SRC_FILES := main.cpp
LOCAL_LDLIBS := -llog -landroid
# The order of these libraries is often important.
LOCAL_LDLIBS += -L$(BOOST_LIB_PATH) \
-lboost_system-gcc-mt-$(BOOST_VERSION) \
-lboost_thread-gcc-mt-$(BOOST_VERSION) \
$(STL_LIBS)
LOCAL_STATIC_LIBRARIES := android_native_app_glue
include $(BUILD_SHARED_LIBRARY)
$(call import-module,android/native_app_glue)
编辑:我们如何为 Android 构建提升。这就是我们在 Makefile 中的内容:
git clone git://github.com/madadam/Boost-for-Android.git
./build-android.sh --boost=1.49.0 --with-libraries=chrono,program_options,system,thread /path/to/ndk
请注意,我们使用的是我们自己的 Boost-for-Android 分支,这只是因为它有一个适用于最新 NDK 版本 r8d 的补丁。从命令行也可以看出我们使用的是1.49版本的boost,这是目前Boost-for-Android支持的最高版本。
如果您想知道支持哪些 Boost 和 Android NDK 组合,请查看 Boost-for-Android 项目。它包含名为 patch/boost-< X >/ndk-android< Y > 的目录,其中X对应于受支持的 boost 版本,Y对应于受支持的 NDK 版本(无耻插件:我们给项目的 2 美分 :-))。