github から RxCpp をダウンロードし、CMakeLists.txt を次のように変更します (VS2015 でクロス プラットフォーム プロジェクトをビルドするために、Microsoft によって変更された 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 によってビルドされたプロジェクトを少し調整しました。
- 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();
}
プロジェクトがコンパイルされず、何百ものエラーが発生します。この行だけでコンパイルしようとすると:
#include "rx.hpp"
すべて正常に動作します。私が行った場合
rxcpp::....
インテリセンスは、いくつかの方法を認識しているようです (あまり多くはありません)。何が起こっているのか分かりません。私は立ち往生しています。誰かが何を試すべきかについて何か提案がありますか? Android 用の RxCpp のコンパイルに成功した人はいますか?
//更新 - 2016 年 3 月 1 日
分析の結果、ほとんどのエラー メッセージはコンパイル エラーではなく、IntelliSense エラーに関連していることが判明しました。したがって、現在、ライブラリは正常にコンパイルされています。次のように、単純な 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 が生成されます (サイズはコメント行のあるバージョンのほぼ 2 倍になります) が、Test2() 関数が呼び出されるとすぐに次のようになります。
System.DllNotFOundException: libTest.so
adb.exe で確認したところ、実際には libTest.so が /data/data/"package_name"/lib/ の下に存在します。
どうしたの?
//更新 - 2016 年 6 月 1 日
最後に、問題を再現するレポを準備する時間を見つけました。
https://github.com/easysoft2k15/AndroidRxCppTest.git
私の疑いでは、何らかの理由で、アプリケーションをクラッシュさせる行を含めると、.so lib のサイズが特定の制限を超えて増加し、Android がそれをロードしなくなります。あなたの考えは非常に高く評価されます。
ありがとうございました
アレッサンドロ