此问题继续Should I choose Boost Asio or Aysnc Socket threads in Android?问,
Boost库旨在广泛使用,并可在各种应用程序中使用,但Android和iOS尚无官方支持
仅供参考。我一直在使用以下链接创建示例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
提前致谢。
答案 0 :(得分:24)
得到了推特社区的回复 是。这些平台没有正式支持,因为没有人 自愿为他们定期进行回归测试。
Boost开发人员无法在所有平台上进行测试。所以 开发人员依赖于运行的回归测试的测试结果 志愿者。例如,请参阅 http://beta.boost.org/development/tests/trunk/developer/summary.html
如果没有人自愿为特定平台运行测试,那就是 平台没有得到官方支持。
因此,如果您关心Android或iOS正式支持, 开始为Boost开始定期(最好每天)回归测试。 见http://beta.boost.org/development/running_regression_tests.html
答案 1 :(得分:15)
查看我在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的应用吗?是的,我已经成功完成了多次,并将应用程序发布到App Stores。
您的另一个问题是,建议使用boost进行网络通信吗?我不确定你的意思。从什么角度来看?你的意思是,在哲学上,技术上等等吗?
哲学上,您必须问自己,您在导入此库并在Android和iOS之间使用它的原因是什么。是节省代码时间,维护负担。如果是这样,我会说这是一个很好的方法。显然,让这种设置工作有一些障碍和痛苦。此外,C ++的IDE功能并不像Eclipse中的Java那样棒。我试图在doc/
目录中的PDF演示中保持公平和平衡。给它一次。
从技术角度来看,我认为我唯一担心的是确保在Activity停止时正确清理Asio对象。如果您需要在后台执行操作,请改为使用服务:
http://developer.android.com/reference/android/app/Service.html
答案 2 :(得分:12)
更新:在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构建提升。这就是我们在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项目。它包含名为patches / boost-&lt; X &gt; / ndk-android&lt; Y &gt;的目录其中 X 对应支持的升级版本, Y 对应支持的NDK版本(无耻插件:我们对项目的2美分: - ))。
答案 3 :(得分:11)
以下是从推广社区收到的更多(非常有用)信息:
- 背后是否有任何具体原因(如未优化) 嵌入式设备)?还是其他任何原因?
醇>
Boost在Android上完美运行。因为有一个NDK(本机开发工具包) 有一个相当不错的gcc(4.6东西)你只需要配置boost构建 使用正确的gcc。虽然这一切都有效,但它需要一点点 修改以正确设置。但同样,原则上,没有一个 在为Android或任何其他Linux构建Boost时有很多不同 分布。
- 如果我们使用boost库,那么(根本没有)任何已知问题 智能手机应用的网络和线程同步 发展?使用BOOST ASIO是不是一个好主意?
醇>
使用Boost.Thread或Boost.Asio完全没问题。他们的工作非常好 在ARM设备上。甚至支持更多平台特定的hackeries 比如boost.atomic和boost.context。
FYI是找到的链接 https://github.com/MysticTreeGames/Boost-for-Android http://www.codexperiments.com/android/2011/05/tips-tricks-building-boost-with-ndk-r5/
使用Android NDK构建增强功能甚至比使用boost.build更简单 直。我编译了一堆Android构建脚本,可以找到它们 这里: https://github.com/STEllAR-GROUP/HPXAndroid/tree/master/modules 查找各种boost库的boost _ $ {module}。这不是一个 完整清单。只有我需要的。此外,可能需要1.53的爱。 所有不同的库都不需要任何特殊的android处理(modulo 一些小错误,编译器不同意其他gcc版本)
我希望这对其他人也有用! 谢谢!