gpt4 book ai didi

android - 为 Android 编译 rxcpp

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:15:09 30 4
gpt4 key购买 nike

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

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. 启用异常(exception)
  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

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

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

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

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

System.DllNotFoundException: libTest.so

我检查了 adb.exe,确实 libTest.so 存在于:/数据/数据/“包名”/lib/

这是怎么回事?

//更新 - 06-01-2016

最后我抽出一些时间来准备一个重现问题的 repo 协议(protocol):

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

我怀疑,由于某些原因,当我包含导致应用程序崩溃的行时,.so 库的大小会增加到一定限度,因此 Android 不再加载它。非常感谢您的想法。

谢谢

亚历山德罗

最佳答案

感谢复制和 issue Alessandro 报告说我找到了解决方法!

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

#define RXCPP_ON_IOS

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

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

关于android - 为 Android 编译 rxcpp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34550833/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com