为Android编译rxcpp
我从github下载了RxCpp,修改了CMakeLists.txt,如下所示(我使用微软修改的CMake,以便使用VS2015构建跨平台项目): 使用以下命令创建Project.sln解决方案:为Android编译rxcpp,android,c++,reactivex,rxcpp,Android,C++,Reactivex,Rxcpp,我从github下载了RxCpp,修改了CMakeLists.txt,如下所示(我使用微软修改的CMake,以便使用VS2015构建跨平台项目): 使用以下命令创建Project.sln解决方案: cmake -G “Visual Studio 14 ARM” –DCMAKE_SYSTEM_NAME=VCMDDAndroid 为了: 启用对C++11的支持 启用异常 STL的使用:GNU STL静态库(gnustl_static) 我添加了一个简单的cpp文件,其中包含以下代码: #inclu
cmake -G “Visual Studio 14 ARM” –DCMAKE_SYSTEM_NAME=VCMDDAndroid
为了:
#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();
}
一切正常。
如果我这样做
intellisense似乎只识别了一些方法(不多)。
我不清楚发生了什么事。
我卡住了。有人对该尝试什么有什么建议吗?
有人在为Android编译RxCpp方面取得了一些成功吗
//更新-03-01-2016
经过一些分析,大多数错误消息不是编译错误,而是与intellisense错误有关。
所以现在库编译成功了。
我建立了一个简单的XAMARIN应用程序,它使用了一个简单的C++函数:
//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();
然后程序编译良好(无错误),生成libTest.so(大小几乎是带有注释行的版本的两倍),但调用Test2()函数后,我得到:
System.DllNotFOundException:libTest.so
我使用adb.exe进行了检查,实际上libTest.so位于:
/data/data/“包名称”/lib/
发生什么事了
//更新-06-01-2016
最后,我花了一些时间准备回购协议,以重现问题:
我的怀疑是,由于某些原因,当我加入导致应用程序崩溃的行时,.so lib的大小会超过一定的限制,因此Android不再加载它。
您的想法将不胜感激
多谢各位
亚历山德罗多亏了重做和亚历山德罗的报告,我找到了解决办法 显然,android和iOS上不支持tls的std库。以前有人为iOS上的rxcpp提供了pthread支持。解决方法是添加:
在IOS上定义RXCPP
在包含rx.hpp
或在编译器上设置-DRXCPP\u ON\u IOS
标志之前
修复将是一个pull请求,它将pthread支持更改为适用于android和iOS。我还没有做过任何android开发,因此拥有一个包含所有更改和示例应用程序的git repo以及安装android/xamarin env所需的步骤将更容易。也就是说,dll not found问题似乎是xamarin/android问题,而不是rxcpp问题。只是好奇:您在java部分/c#部分也使用了reactive吗?是否考虑将rxcpp与另一个rx库组合?@ixx是的,我也在C#端使用rx,但我没有将这两个库组合起来。@easysoft2k15嘿,谢谢您的回答!用一个组合来继续流,即观察/继续转换C++中启动的事件?我们的意思是一样的吗?@Ixx,我的意思是一样的。我更喜欢将这两个世界分开,每个世界都有自己的业务逻辑。所以最后我不会在两者之间传递流。感谢Kirk Shoop的帮助,我更新了我的Github示例项目,供其他人参考:
#include "rx.hpp"
rxcpp::....
//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();
keys.subscribe([](int key)
{
int a = key;
});