0

我有一个名为 Square 的简单 C++ 类,它继承自 Comparable(具有函数 compareTo 的接口)。

这是 compareTo 方法的 C++ 实现:

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

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

我用 Android-ndk (r8c) 生成了 libray (.so 文件)。在下面找到 Android.mk 和 Application.mk 的代码

安卓.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)

应用程序.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");

结果显示 4,关于 c++ 代码,这意味着 s3 不是 Square。问题是,如果我在 Application.mk 文件中更改APP_STL := gnustl_static为,结果为 2。APP_STL := stlport_static

有人能帮我吗 ?

4

1 回答 1

0

构造函数和dynmic_castin 是不同的共享对象吗?如果是这样,传递给的选项是dlopen什么?如果共享对象是用 加载的RTLD_LOCAL,那么 g++ 会认为Square一个中的类型与另一个中的类型无关Square,因此dynamic_cast会失败。

如果您没有dlopen显式调用,则隐式加载将使用用于加载需要共享对象的共享对象的标志。当 Java 加载共享对象时,它使用RTLD_LOCAL,这意味着由该共享对象隐式加载的任何其他共享对象也将使用 RTLD_LOCAL。在我们的例子中,我们创建了一个小的前端共享对象,它除了加载我们需要的所有共享对象之外什么都不做,按照依赖关系确定的顺序,这样就不会有隐式加载,我们可以完全控制论据dlopen。我们通过派生所有调用我们库的 Java 类来做到这一点,这些类从一个公共基类包含如下内容:

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

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

然后该initializeLibrary()函数dlopen按照依赖关系确定的顺序执行显式的序列。

于 2012-12-21T09:24:35.153 回答