51

这个问题是我应该在 Android 中选择 Boost Asio 还是 Aysnc Socket 线程的延续?问,

Boost 库旨在广泛有用,并且可在广泛的应用程序中使用,但尚未对 Android 和 iOS 提供官方支持

  1. 是否有任何特定原因,例如未针对嵌入式设备进行优化?还是其他什么原因?
  2. 有人知道在 Android 或 iOS 上使用 Boost 构建的任何应用程序吗?
  3. 是否建议将 boost 库用于产生多个线程进行通信的网络密集型应用程序?

仅供参考..我一直在使用以下链接创建示例 Android 应用程序,但尚未成功:(

https://github.com/MysticTreeGames/Boost-for-Android

http://www.codexperiments.com/android/2011/05/tips-tricks-building-boost-with-ndk-r5/

在 android 中包含 Boost C++ 库

如何在 Android NDK 和 STLport 中使用 boost 库(包括 shared_ptr)

https://sites.google.com/site/fourdollars/android/android-mk

https://groups.google.com/forum/?fromgroups=#!topic/android-ndk/4lxhsKFe7Ho

http://www.crystax.net/trac/ndk/ticket/6

Android NDK R5 和对 C++ 异常的支持

提前致谢。

4

4 回答 4

24

得到了 boost 社区的回复 是的。这些平台没有得到官方支持,因为没有人自愿为它们定期运行回归测试。

Boost 开发人员不可能在所有平台上进行测试。因此开发人员依赖于志愿者运行的回归测试的测试结果。例如,请参阅 http://beta.boost.org/development/tests/trunk/developer/summary.html

如果没有人自愿为特定平台运行测试,则该平台不受官方支持。

因此,如果您关心 Android 或 iOS 获得官方支持,请开始为 Boost 运行定期(最好是每天)回归测试。见http://beta.boost.org/development/running_regression_tests.html

于 2012-12-27T12:17:30.797 回答
17

在 github 上查看我的跨平台教程。它向您展示了如何设置 Boost 并在 iOS 和 Android 之间使用它。我在这方面度过了一段可怕的时光,我想我会记录下来,这样其他人就不必弄清楚了。您会注意到,该项目还引入了两个平台之间使用的其他几个常用项目,例如 CoreFoundation 和 SQLite。

https://github.com/markshiz/cross-platform-tutorial

注意:我的教程没有展示如何构建用于 boost 的编译库。我之前使用您提供的说明成功完成了此操作:

http://www.codexperiments.com/android/2011/05/tips-tricks-building-boost-with-ndk-r5/

有了 Android 工具链编译好的静态库后,您可以通过类似于include/[NAME OF NEW SUBMODULE]上面项目目录下的模块轻松链接它。Android.mk对该目录根目录中的文件使用类似于以下内容的内容。

include $(CLEAR_VARS)
LOCAL_MODULE:= boost_regex
LOCAL_SRC_FILES:= ./path/to/built/static/library/libboost_regex-gcc-mt-s.a
LOCAL_EXPORT_C_INCLUDES := ./path/to/the/directory/that/has/the/boost/headers
include $(PREBUILT_STATIC_LIBRARY)

最后,像示例中一样,在里面导入该模块

$(call import-module,[NAME OF NEW SUBMODULE])

至于您的其他问题——您知道在 iOS 和 Android 上使用 Boost 的应用程序吗?是的,我已经成功完成了多次,并将工作应用程序发布到应用商店。

您的另一个问题,是否建议使用 boost 进行网络通信?我不确定你在这里的意思。从什么角度?你的意思是,哲学上,技术上,等等?

从哲学上讲,你必须问自己,你导入这个库并在 Android 和 iOS 之间使用它的理由是什么。是不是为了节省代码时间、维护负担。如果是这样,我会说这是一个很好的方法。显然,要使这种设置正常工作存在一些障碍和痛苦。此外,C++ 的 IDE 功能不如 Eclipse 中的 Java 出色。我试图在doc/目录中的 PDF 演示文稿中做到公平和平衡。给它一次。

从技术角度来看,我认为我唯一担心的是确保在 Activity 停止时正确清理 Asio 对象。如果您需要在后台执行操作,请改用 Service:

http://developer.android.com/reference/android/app/Service.html

于 2013-01-01T18:09:15.293 回答
12

更新: 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 美分 :-))。

于 2012-12-30T10:31:45.147 回答
11

以下是从 boost 社区收到的更多(非常有用的)信息:

  1. 背后是否有任何特定原因(例如未针对嵌入式设备进行优化)?还是其他什么原因?

Boost 在 Android 上完美运行。由于有一个带有相当不错的 gcc(4.6 左右)的 NDK(本机开发工具包),您只需要配置 boost build 以使用正确的 gcc。尽管这一切都有效,但需要进行一些修改才能正确设置。但同样,原则上,为 Android 或任何其他 Linux 发行版构建 Boost 并没有太大区别。

  1. 如果我们将 boost 库用于智能手机应用程序开发的网络和线程同步,是否存在(根本)任何已知问题?使用 BOOST ASIO 来做同样的事情会是个好主意吗?

使用 Boost.Thread 或 Boost.Asio 非常好。它们在 ARM 设备上运行良好。甚至支持更多特定于平台的黑客,如 boost.atomic 和 boost.context。

仅供参考是找到的链接 https://github.com/MysticTreeGames/Boost-for-Android http://www.codexperiments.com/android/2011/05/tips-tricks-building-boost-with-ndk-r5/

使用 Android NDK 构建 boost 比直接使用 boost.build 更简单。我编译了一堆 Android 构建脚本,可以在这里找到: https ://github.com/STEllAR-GROUP/HPXAndroid/tree/master/modules 寻找各种 boost 库的 boost_${module}。这不是一个完整的列表。只有我需要的。此外,可能需要一些对 1.53 的喜爱。所有不同的库都不需要任何特殊的 android 处理(以编译器不同意其他 gcc 版本的一些小错误为模)

我希望这对其他人也有用!谢谢!

于 2013-01-03T12:17:01.493 回答