2

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 によってビルドされたプロジェクトを少し調整しました。

  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::....

インテリセンスは、いくつかの方法を認識しているようです (あまり多くはありません)。何が起こっているのか分かりません。私は立ち往生しています。誰かが何を試すべきかについて何か提案がありますか? 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 がそれをロードしなくなります。あなたの考えは非常に高く評価されます。

ありがとうございました

アレッサンドロ

4

1 に答える 1

1

再現とAlessandro が報告した問題のおかげで、回避策を見つけることができました。

どうやら、Android と iOS では tls の std lib サポートが除外されているようです。以前、誰かが iOS 上の rxcpp の pthread サポートに貢献しました。回避策は、次を追加することです。

#define RXCPP_ON_IOS

コンパイラにフラグを含めるrx.hppか、設定する前に。-DRXCPP_ON_IOS

この修正は、iOS だけでなく Android でも機能するように pthread サポートを変更するプル リクエストになります。

于 2016-01-08T16:41:00.683 に答える