官方“Boost 库”支持 Android 和 iOS? [关闭]

Posted

技术标签:

【中文标题】官方“Boost 库”支持 Android 和 iOS? [关闭]【英文标题】:Official "Boost library" Support for Android and iOS? [closed] 【发布时间】:2012-12-11 18:13:14 【问题描述】:

这个问题延续到Should I choose Boost Asio or Aysnc Socket threads in android?问,

Boost 库旨在广泛有用,并且可用于各种应用程序,但目前还没有适用于 Android 和 ios 的官方支持

    相同的背后是否有任何特定原因未优化 嵌入式设备?还是其他原因? 是否有人知道在 Android 或 iOS 上使用 Boost 构建的任何应用程序? 对于产生多个通信线程的网络密集型应用程序,是否建议使用 boost 库?

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

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

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

Include Boost C++ library in android

How to use the boost library (including shared_ptr) with the Android NDK and STLport

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 and support of C++ exception

提前致谢。

【问题讨论】:

从技术上讲,您需要对这些平台的官方支持,而不是 ports 对于智能手机应用程序开发来说是否可取的提升? FWIW,我成功地为 iOS 和 Android 构建了我的应用程序(它非常广泛地使用了 boost)。我认为缺乏“官方”支持的主要原因是没有人自愿为这些平台运行发布测试。 ...至于“产生多线程通信的网络密集型应用程序”——您可以使用 Boost.Asio 并从“多线程”及其所有混乱和开销切换到更好的 Asio 主动模型。 Hi Igor R.--> 我想我们需要 boost_filesytem.a 用于 Boost.Asio,但我无法使用 codexperiments.com/android/2011/05/… 中提供的方法获得相同的结果。你能告诉我你是如何编译它的程序吗? 【参考方案1】:

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

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

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

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

【讨论】:

我很乐意通过运行夜间回归测试来使用我工作的一些硬件。问题是编译是跨平台的,对制作应用程序有特定的要求(你不能只在这些平台上制作控制台应用程序),并且测试需要在外部设备/模拟器/模拟器上运行。据我所知,现有的测试套件并没有为此配备。但是,我愿意与比我更熟悉增强测试的人一起努力完成这项工作。我的名字(在)brainiumstudios.com CrystaX crystax.net 项目自 2015 年 3 月以来推出了针对 Android 的定期回归测试 boost.org/development/tests/master/developer/summary.html habrahabr.ru/post/253233 (rus)【参考方案2】:

查看我在 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

【讨论】:

谢谢!你是否在 iOS 上使用过 boost::asio 并发现任何问题?【参考方案3】:

更新: Android 上的 std::atomic 似乎存在问题,并且由于 Boost.Asio 正在使用它(默认情况下),结合线程,偶尔会出现死锁。幸运的是,Boost.Asio 可以轻松地从 Std.Atomic 切换到 Boost.Atomic,这已经在 Boost-for-Android 项目的 this commit 中得到了解决。

有关该错误的更多信息,请参阅here


我们正在使用 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 构建 boost。这就是我们在 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-androidY> 的目录,其中 X 对应于支持的 boost 版本,Y 到受支持的 NDK 版本(无耻插件:我们的 2 美分给项目 :-))。

【讨论】:

网络和多线程支持需要哪些 boost 库? 添加这三个库:-lboost_system-gcc-mt-、-lboost_thread-gcc-mt- 和 -lgnustl_static(按此顺序)。那应该这样做。让我们看看您所看到的确切错误,如果没有它,很难猜测如何提供帮助。对我们有帮助的其他信息:NDK 版本、您正在开发的平台以及您使用的是 eclipse 还是 ant+makefiles。 谢谢彼得。分析您的回复后解决了问题。一个查询。你是如何在 android 上遵守 boost 的?你使用 boost 1_52 @RDX,我已经对我的帖子进行了编辑,请看一下。 Boost-for-Android 目前支持的最新版本是 1.49。 @RDX,或者我误解了你关于“在 on android 上编译”的问题。您的意思是要问如何在 android 设备中执行 boost 的编译?在这种情况下,您不需要这样做(这将非常痛苦),您只需要确保您从 Boost-For-Android 使用的库进入 apk 文件即可。如何做到这一点取决于您使用的是makefile还是eclipse。例如,如果您使用上面提到的 Android.mk,这将是自动的。【参考方案4】:

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

    这背后是否有任何具体原因(例如未针对 嵌入式设备)?还是其他原因?

Boost 在 Android 上完美运行。因为有一个 NDK(本机开发工具包) 使用相当不错的 gcc(4.6 左右),您只需要配置 boost build 使用正确的 gcc。虽然这一切都有效,但它需要一点点 修补以使设置正确。但同样,原则上不存在 为 Android 或任何其他 linux 构建 Boost 有很多不同之处 分布。

    如果我们将 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 版本不一致的一些小错误)

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

【讨论】:

官方支持需要一名志愿者测试员,以便维护人员可以解决问题。如果你有能力,请定期运行回归测试。 在 iOS 设备上怎么样?

以上是关于官方“Boost 库”支持 Android 和 iOS? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何验证我使用的 boost 库是不是支持 C++11?

解决Boost库链接出错问题

VS2008编译boost库

如何找出特定 Boost 库需要哪些依赖项(即其他 Boost 库)?

将 Boost 库包含到标准 MinGW 路径中

在 Windows 下,Android 的 boost 编译失败