0

Comparable (関数 compareTo を持つインターフェイス) から継承する Square という単純な C++ クラスがあります。

これは、compareTo メソッドの C++ 実装です。

int Square::compareTo(Comparable* c, char criteria) {

    if (dynamic_cast<Square*>(c) != NULL) {
        return 2;
    }
    else {
        return 4;
    }
}

Android-ndk (r8c) でライブラリ (.so ファイル) を生成しました。Android.mk と Application.mk のコードの下を見つけます

Android.mk :

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := testinterface
LOCAL_SRC_FILES := wrappers.cpp Shape.cpp Square.cpp Circle.cpp
LOCAL_CPP_FEATURES += rtti
//LOCAL_CFLAGS    := -frtti           -> The commented lines were tests
//LOCAL_CPP_FEATURES += exceptions
//LOCAL_CPPFLAGS += -fexceptions

include $(BUILD_SHARED_LIBRARY)

Application.mk :

//APP_CPPFLAGS += -frtti -> That was for a test but it didn't work either
APP_STL := gnustl_static

関数compareToを呼び出すために使用するJavaコードは次のとおりです(SWIGを使用してJavaラッパーを生成しました):

Square s = new Square(10);
Square s3 = new Square(10);
outputText.append("s.compareTo(s3) ? " + s.compareTo(new Comparable(Square.getCPtr(s3), false), 'c') +"\n");

s3 が正方形ではないことを意味する c++ コードに関して、結果は 4 を示します。問題は、Application.mk ファイルを変更APP_STL := gnustl_staticすると、結果が 2 になることです。APP_STL := stlport_static

誰かが私を助けることができますか?

4

1 に答える 1

0

コンストラクターと はdynmic_cast別の共有オブジェクトにありますか? もしそうなら、に渡されたオプションは何でしたdlopenか? 共有オブジェクトが でロードされている場合、RTLD_LOCALg++ は一方の型Squareが他方の型と無関係であると見なすSquareため、dynamic_castは失敗します。

明示的に呼び出していない場合dlopen、暗黙的なロードは、共有オブジェクトを必要とする共有オブジェクトをロードするために使用されるフラグを使用します。Java が共有オブジェクトをロードするとき、Java は を使用します。これはRTLD_LOCAL、その共有オブジェクトによって暗黙的にロードされた他の共有オブジェクトも を使用することを意味します RTLD_LOCAL私たちの場合、小さなフロントエンド共有オブジェクトを作成しました。これは、依存関係によって決定される順序で、必要なすべての共有オブジェクトをロードする以外には何もしませんでした。への引数dlopen。これを行うには、次のようなものを含む共通の基本クラスから、ライブラリを呼び出したすべての Java クラスを派生させました。

//  In the Java base class...
private static native void initializeLibrary();

static
{
    System.loadLibrary("WrapperLibrary");
    initializeLibrary();
}

次に、関数は依存関係で決定されたinitializeLibrary()順序で、 explicit のシーケンスを実行しました。dlopen

于 2012-12-21T09:24:35.153 に答える