【问题标题】:Compile rxcpp for Android为 Android 编译 rxcpp
【发布时间】:2015-12-31 19:26:46
【问题描述】:

我从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 构建的项目,以便:

  1. 启用对 C++11 的支持
  2. 启用例外
  3. 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 方面取得了一些成功吗?

//更新 - 03-01-2016

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

如果我在手机上编译和部署一切正常(甚至认为真的没有使用“反应性”代码......)。 问题是当我取消注释以下行时:

    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

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

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

我的怀疑是,由于某些原因,当我包含使应用程序崩溃的行时,.so 库的大小会增加超过一定限制,因此 Android 不再加载它。 您的想法将不胜感激。

谢谢

亚历山德罗

【问题讨论】:

  • 我还没有完成任何 android 开发,因此拥有一个包含所有更改和示例应用程序的 git 存储库以及安装重现所需的 android/xamarin env 的步骤会容易得多。也就是说,找不到 dll 的问题似乎是 xamarin / android 问题而不是 rxcpp 问题。
  • 只是好奇:您是否也在 java 部分/c# 部分中使用响应式?关于将 rxcpp 与另一个 rx 库结合起来有什么想法吗?
  • @ixx 是的,我也在 C# 端使用 rx,但我没有合并这两个库。
  • @easysoft2k15 嘿,感谢您的回答!使用 combine a 意味着继续流,即观察/继续转换在 c++ 中启动的事件?我们的意思是一样的吗?
  • @Ixx,我的意思是一样的。我更喜欢将两个世界分开,每个世界都有自己的业务逻辑。所以最后我不会在两者之间传递流。

标签: android c++ reactivex rxcpp


【解决方案1】:

感谢 repro 和 issueAlessandro 报告我能够找到解决方法!

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

#define RXCPP_ON_IOS

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

修复将是一个拉取请求,将 pthread 支持更改为适用于 android 和 iOS。

【讨论】:

猜你喜欢
  • 2012-02-12
  • 2020-09-14
  • 1970-01-01
  • 2016-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多