官方“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-以下是从 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? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章