Dem*_*yro 2 android boost cross-platform boost-asio
我正在尝试为Android和iOS构建一个跨平台的应用程序,并选择使用Boost来简化通信并从响应中解析JSON.在iOS中一切正常,但是如果我将查询更改为,则Android会因"找不到服务"错误或"未找到主机(权威)"而失败query(server, "");.
我从我的应用程序中取出代码并将其简化为抛出错误的内容,这就是我所拥有的:
...
#include <boost/asio.hpp>
boost::asio::io_service io_service;
std::string server = "<server_address>";
// Get a list of endpoints corresponding to the server name.
boost::asio::ip::tcp::resolver resolver(io_service);
boost::asio::ip::tcp::resolver::query query(server, "http");
boost::system::error_code ec;
boost::asio::ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve(query,ec);
if (ec)
{
return env->NewStringUTF(ec.message().c_str());
}
Run Code Online (Sandbox Code Playgroud)
我正在使用Android NDK r8e(64位)和Boost版本1.53(撰写时的最新版本).我使用https://github.com/MysticTreeGames/Boost-for-Android进行了一些修改,可以使用64位NDK(参见https://github.com/MysticTreeGames/Boost-for-Android/pull/28)用于构建所需的Boost库.
我将修改它以使用async_resolve,这是iOS版本正在使用的,一旦我可以使这部分工作.
编辑:
我注意到我忘了更新Android Manifest文件,所以我添加了
<uses-permission android:name="android.permission.INTERNET"></uses-permission>,但我仍然得到相同的错误.我只是在清单中遗漏了其他东西吗?
这意味着操作系统无法确定哪个端口代表http.在大多数符合POSIX的系统上,此映射在/etc/services文件中完成,如果http缺少行,则会出现"找不到服务"错误.
我不知道Android是否有这个文件(旧版本根本不支持它,服务是硬编码的bionic),但如果你得到上述错误,唯一的解决方法是手动设置所需的端口:
tcp::resolver::query query(tcp::v4(), yourHost, "80");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
793 次 |
| 最近记录: |