为Android编译rxcpp

为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

我从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文件,其中包含以下代码:

    #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;
        });