首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为Android编译rxcpp

为Android编译rxcpp
EN

Stack Overflow用户
提问于 2015-12-31 19:26:46
回答 1查看 793关注 0票数 2

我从github下载RxCpp,按如下方式修改CMakeLists.txt (我使用微软修改的CMake来使用VS2015构建跨平台项目):

代码语言:javascript
复制
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解决方案:

代码语言:javascript
复制
cmake -G “Visual Studio 14 ARM” –DCMAKE_SYSTEM_NAME=VCMDDAndroid

我对CMake构建的项目做了一些调整,以便:

  1. 启用对C++11的支持
  2. 启用例外
  3. STL的使用: GNU静态库(gnustl_static)

我使用以下代码添加了一个简单的cpp文件:

代码语言:javascript
复制
#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();
}

项目不会编译,并会产生数百个错误。如果我只是尝试使用以下行进行编译:

代码语言:javascript
复制
#include "rx.hpp"

一切都很好。如果我做了

代码语言:javascript
复制
rxcpp::....

intellisense似乎只是识别了一些方法(并不多)。我不清楚这是怎么回事。我卡住了。有人对该做什么有什么建议吗?有人成功地为安卓系统编译了RxCpp吗?

//更新-03-01-2016年

经过分析,大多数错误消息不是编译错误,而是与intellisense错误相关的错误。所以现在,库成功地编译了。我设置了一个简单的Xamarin应用程序,它使用一个简单的c++函数,如下所示:

代码语言:javascript
复制
//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();

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

代码语言:javascript
复制
    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不再加载它。你的想法将不胜感激。

谢谢

阿莱桑德罗

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-08 16:41:00

多亏了repro和问题 Alessandro的报道,我找到了一个解决办法!

显然,对tls的std支持在android和iOS中被排除在外。以前有人在iOS上为rxcpp提供了p线程支持。解决办法是添加:

#define RXCPP_ON_IOS

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

修复将是一个拉请求,它改变了对android和iOS的线程支持。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34550833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档