为Android编译rxcpp

时间:2015-12-31 19:26:46

标签: android c++ reactivex rxcpp

我从github下载RxCpp,修改CMakeLists.txt如下(我使用Microsoft修改的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的项目构建,以便:

  1. 启用对C ++ 11的支持
  2. 启用例外
  3. 使用STL:GNU STL静态库(gnustl_static)
  4. 我添加了一个简单的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();
    }
    

    Project不编译并提供数百个错误。 如果我只是尝试用这一行编译:

    #include "rx.hpp"
    
    一切正常。 如果我做

    rxcpp::....
    
    intellisense似乎只是认识了一些方法(不多)。 我不清楚它是怎么回事。 我被卡住了。有人对尝试什么有一些建议吗? 有人在为Android编译RxCpp方面取得了一些成功吗?

    //更新 - 03-01-2016

    经过一些分析后发现,大多数错误消息不是编译错误,而是与智能感知错误有关。 所以现在库已成功编译。 我设置了一个简单的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();
    

    如果我在手机上编译和部署,一切工作都很好(甚至认为&#34;反应性&#34;代码未被使用......)。 问题是当我取消注释以下行时:

        keys.subscribe([](int key)
        {
           int a = key;
        });
    

    然后程序编译正常(没有错误),生成libTest.so(大小几乎是带注释行的版本的两倍)但是一旦调用了Test2()函数,我得到:

    System.DllNotFOundException:libTest.so

    我使用adb.exe检查过,实际上libTest.so存在于: /数据/数据/&#34;程序包&#34; / LIB /

    发生了什么?

    //更新 - 2016年1月6日

    最后,我找到了一些时间来准备一个重现问题的回购:

    https://github.com/easysoft2k15/AndroidRxCppTest.git

    我怀疑是由于某些原因,当我包含崩溃应用程序的行时,.so lib的大小会增加超过某个限制,因此Android不再加载它。 您的想法将受到高度赞赏。

    谢谢

    的Alessandro

1 个答案:

答案 0 :(得分:1)

感谢repro和issue亚历山德罗报道我找到了一个解决方法!

显然,在Android和iOS上排除了对tls的std lib支持。以前有人在iOS上为rxcpp提供了pthread支持。解决方法是添加:

#define RXCPP_ON_IOS

在包含rx.hpp或在编译器上设置-DRXCPP_ON_IOS标志之前

修复将是一个pull请求,它将pthread支持更改为适用于Android和iOS。