为 Android 编译 rxcpp
Compile rxcpp for Android
我从github下载了RxCpp,修改CMakeLists.txt如下(我使用微软修改的CMake,以便用VS2015构建跨平台项目):
cmake_minimum_required (VERSION 3.4)
project(RxCppAndroid VERSION 2.2.4 LANGUAGES C CXX)
file(GLOB_RECURSE SOURCES "rxcpp/*.*")
# Grouping all the source files puts them into a virtual folder in Visual Studio
source_group("src" FILES ${SOURCES})
add_library(RxCppAndroid SHARED ${SOURCES})
SET_TARGET_PROPERTIES(RxCppAndroid PROPERTIES LINKER_LANGUAGE CXX)
# optional, demo of the VC_MDD_ANDROID* properties
set_property(TARGET RxCppAndroid PROPERTY VC_MDD_ANDROID_USE_OF_STL "c++_static")
set_property(TARGET RxCppAndroid PROPERTY VC_MDD_ANDROID_API_LEVEL "android-21")
使用以下命令创建了 Project.sln 解决方案:
cmake -G “Visual Studio 14 ARM” –DCMAKE_SYSTEM_NAME=VCMDDAndroid
我对 CMake 构建的项目进行了一些调整,以便:
- 启用对 C++11 的支持
- 启用例外
- STL的使用:GNU STL静态库(gnustl_static)
我使用以下代码添加了一个简单的 cpp 文件:
#include "rx.hpp"
int test()
{
auto keys = rxcpp::observable<>::create<int>(
[](rx::subscriber<int> dest) {
for (;;) {
int key = std::cin.get();
dest.on_next(key);
}
}).
publish();
}
项目无法编译并出现数百个错误。
如果我只是尝试用这一行编译:
#include "rx.hpp"
一切正常。
如果我这样做
rxcpp::....
intellisense 似乎只识别了一些方法(不多)。
我不清楚发生了什么。
我卡住了。有人对尝试什么有什么建议吗?
有人成功地为 Android 编译了 RxCpp 吗?
//更新 - 2016 年 3 月 1 日
经过一番分析发现,大部分错误信息都不是编译错误,而是与智能感知错误有关。
所以现在库编译成功。
我设置了一个使用简单 C++ 函数的简单 Xamarin 应用程序,如下所示:
//C++
#include "rx.hpp"
int test()
{
auto keys = rxcpp::observable<>::create<int>([](rxcpp::subscriber<int> dest)
{
dest.on_next(5);
}).
publish();
//keys.subscribe([](int key)
//{
// int a = key;
//});
return 0;
}
extern "C"
{
int test2()
{
return 5;
}
}
//C#
[DllImport("libTest.so")]
public extern static int test2();
var res=test2();
如果我在 phone 上编译和部署一切正常(甚至认为真的没有使用 "reactive" 代码...)。
问题是当我取消注释以下行时:
keys.subscribe([](int key)
{
int a = key;
});
然后程序编译正常(没有错误),生成 libTest.so (大小几乎是带有注释行的版本的两倍)但是一旦调用 Test2() 函数我得到:
System.DllNotFOundException: libTest.so
我用 adb.exe 检查了一下,libTest.so 确实存在于:
/data/data/"package_name"/lib/
怎么回事?
//更新 - 06-01-2016
终于我找到了一些时间来准备重现问题的回购协议:
https://github.com/easysoft2k15/AndroidRxCppTest.git
我怀疑,由于某些原因,当我包含使应用程序崩溃的行时,.so 库的大小增加了一定的限制,因此 Android 不再加载它。
非常感谢您的想法。
谢谢
亚历山德罗
感谢重现和 issue Alessandro 报告我找到了解决方法!
显然,android 和 iOS 上排除了对 tls 的标准库支持。之前有人在 iOS 上贡献了对 rxcpp 的 pthread 支持。解决方法是添加:
#define RXCPP_ON_IOS
在包含 rx.hpp
之前或在编译器上设置 -DRXCPP_ON_IOS
标志。
修复将是一个拉取请求,更改 pthread 支持以适用于 android 以及 iOS。
我从github下载了RxCpp,修改CMakeLists.txt如下(我使用微软修改的CMake,以便用VS2015构建跨平台项目):
cmake_minimum_required (VERSION 3.4)
project(RxCppAndroid VERSION 2.2.4 LANGUAGES C CXX)
file(GLOB_RECURSE SOURCES "rxcpp/*.*")
# Grouping all the source files puts them into a virtual folder in Visual Studio
source_group("src" FILES ${SOURCES})
add_library(RxCppAndroid SHARED ${SOURCES})
SET_TARGET_PROPERTIES(RxCppAndroid PROPERTIES LINKER_LANGUAGE CXX)
# optional, demo of the VC_MDD_ANDROID* properties
set_property(TARGET RxCppAndroid PROPERTY VC_MDD_ANDROID_USE_OF_STL "c++_static")
set_property(TARGET RxCppAndroid PROPERTY VC_MDD_ANDROID_API_LEVEL "android-21")
使用以下命令创建了 Project.sln 解决方案:
cmake -G “Visual Studio 14 ARM” –DCMAKE_SYSTEM_NAME=VCMDDAndroid
我对 CMake 构建的项目进行了一些调整,以便:
- 启用对 C++11 的支持
- 启用例外
- STL的使用:GNU STL静态库(gnustl_static)
我使用以下代码添加了一个简单的 cpp 文件:
#include "rx.hpp"
int test()
{
auto keys = rxcpp::observable<>::create<int>(
[](rx::subscriber<int> dest) {
for (;;) {
int key = std::cin.get();
dest.on_next(key);
}
}).
publish();
}
项目无法编译并出现数百个错误。 如果我只是尝试用这一行编译:
#include "rx.hpp"
一切正常。 如果我这样做
rxcpp::....
intellisense 似乎只识别了一些方法(不多)。 我不清楚发生了什么。 我卡住了。有人对尝试什么有什么建议吗? 有人成功地为 Android 编译了 RxCpp 吗?
//更新 - 2016 年 3 月 1 日
经过一番分析发现,大部分错误信息都不是编译错误,而是与智能感知错误有关。 所以现在库编译成功。 我设置了一个使用简单 C++ 函数的简单 Xamarin 应用程序,如下所示:
//C++
#include "rx.hpp"
int test()
{
auto keys = rxcpp::observable<>::create<int>([](rxcpp::subscriber<int> dest)
{
dest.on_next(5);
}).
publish();
//keys.subscribe([](int key)
//{
// int a = key;
//});
return 0;
}
extern "C"
{
int test2()
{
return 5;
}
}
//C#
[DllImport("libTest.so")]
public extern static int test2();
var res=test2();
如果我在 phone 上编译和部署一切正常(甚至认为真的没有使用 "reactive" 代码...)。 问题是当我取消注释以下行时:
keys.subscribe([](int key)
{
int a = key;
});
然后程序编译正常(没有错误),生成 libTest.so (大小几乎是带有注释行的版本的两倍)但是一旦调用 Test2() 函数我得到:
System.DllNotFOundException: libTest.so
我用 adb.exe 检查了一下,libTest.so 确实存在于: /data/data/"package_name"/lib/
怎么回事?
//更新 - 06-01-2016
终于我找到了一些时间来准备重现问题的回购协议:
https://github.com/easysoft2k15/AndroidRxCppTest.git
我怀疑,由于某些原因,当我包含使应用程序崩溃的行时,.so 库的大小增加了一定的限制,因此 Android 不再加载它。 非常感谢您的想法。
谢谢
亚历山德罗
感谢重现和 issue Alessandro 报告我找到了解决方法!
显然,android 和 iOS 上排除了对 tls 的标准库支持。之前有人在 iOS 上贡献了对 rxcpp 的 pthread 支持。解决方法是添加:
#define RXCPP_ON_IOS
在包含 rx.hpp
之前或在编译器上设置 -DRXCPP_ON_IOS
标志。
修复将是一个拉取请求,更改 pthread 支持以适用于 android 以及 iOS。