编译适用于Android的rxcpp
Compile rxcpp for Android
我从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构建的项目进行了一点调整,以便:
- 启用对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();
}
Project不编译,并给出数百个错误。如果我只是试着用这一行进行编译:
#include "rx.hpp"
一切都很好。如果我做
rxcpp::....
intellisense似乎只是识别了一些方法(不多)。我不清楚发生了什么事。我被卡住了。有人对尝试什么有什么建议吗?有人成功编译了适用于Android的RxCpp吗?
//更新-2016年1月3日
经过分析,大多数错误消息不是编译错误,而是与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();
如果我在手机上编译和部署,一切都会很好(即使真的认为没有使用"反应式"代码…)。问题是当我取消注释以下行时:
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-lib的大小会增加到一定的限制,因此Android不再加载它。非常感谢您的想法。
谢谢
Alessandro
多亏了repo和Alessandro报告的问题,我找到了解决办法!
显然,对tls的std-lib支持在android和iOS上被排除在外。之前有人在iOS上为rxcpp提供了pthread支持。解决方法是添加:
#define RXCPP_ON_IOS
在包括CCD_ 2之前或者在编译器上设置CCD_。
修复将是一个pull请求,它将pthread支持更改为适用于android和iOS。
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用ndk-build.cmd构建Android.so文件
- Android NDK传感器向事件队列报告奇怪的间隔
- Android P-9.0.0_r53 Logcat主缓冲区超出定义大小
- OpenCV Android C++ imwrite not found
- Android NDK 编译 LAME HAVE_MPGLIB > 'interface.h' 文件未找到
- 如何使用 Boost Asio 在 Android 上获取我的本地 udp IP 地址?
- Android Studio 中带有静态库的原生C++代码
- 如何在 Android Studio 4 中编译 C/C++ 原生代码
- Android NDK clang 编译器错误在 Windows 上显示'No such file or directory'
- Android 在编译二进制文件时重建静态库
- 我只想在Android 4.4中使用C++11库
- 无法将标准库导入本机 android 项目中的头文件
- Android Java USB for native cpp
- 来自 Android 应用程序内部的 boost 类型的 boost::wrapexcept<boost::system::system_error> 的未捕获异常
- Android Studio:如何在build.gradle中定义自定义宏(针对不同的构建变体),并让原生C / C++
- 在Android原生C++中使用Facemark opencv contrib
- 最小的CMake构建为Android
- 更新后的Android Studio现在需要Clang,不再链接到GCC的库
- 编译适用于Android的rxcpp