dynamic_cast的行为方式与APP_STL不同:= gnustl_static

时间:2012-12-21 09:09:28

标签: c++ android-ndk dynamic-cast

我有一个名为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的代码

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");

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

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

构造函数和dynmic_cast是否在不同的共享中 对象?如果是这样,那么传递给dlopen的选项是什么? 如果共享对象加载了RTLD_LOCAL,那么g ++ 会将Square中的类型视为与...无关 在另一个中键入Square,因此dynamic_cast将失败。

如果你没有明确地调用dlopen,那么隐含 load将使用用于加载共享对象的标志 需要你的共享对象。当Java加载共享对象时,它 使用RTLD_LOCAL,这意味着任何其他共享对象 由该共享对象隐式加载也将使用 RTLD_LOCAL。在我们的例子中,我们创建了一个小的前端共享 对象,除了加载所有共享之外什么也没做 我们需要的对象,按依赖项确定的顺序, 这样就不会有任何牵连,我们可以控制 绝对是dlopen的论据。我们通过推导来做到这一点 所有调用我们库的Java类 一个公共基类,包含:

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

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

然后initializeLibrary()函数执行了序列 显式dlopen,以依赖关系确定的顺序。