dynamic_cast的行为与APP_STL:=gnustl_static不一样

dynamic_cast does not behave the way it should with APP_STL := gnustl_static

本文关键字:gnustl static 不一样 STL cast dynamic APP      更新时间:2023-10-16

我有一个名为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(生成了库(.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不是正方形。问题是,如果我在Application.mk文件中将APP_STL := gnustl_static更改为APP_STL := stlport_static,结果是2。

有人能帮我吗?

构造函数和dynmic_cast是否处于不同的共享对象?如果是,传递给dlopen的选项是什么?如果用RTLD_LOCAL加载共享对象,则g++将认为Square类型与在另一个中键入Square,则dynamic_cast将失败。

如果您没有显式调用dlopen,那么隐式load将使用用于加载共享对象的标志需要您的共享对象。当Java加载共享对象时使用RTLD_LOCAL,这意味着任何其他共享对象由该共享对象隐式加载的也将使用CCD_ 11。在我们的案例中,我们创建了一个小型前端共享对象,除了加载所有共享我们需要的对象,按依赖关系确定的顺序,这样就不会有隐含的负载,我们可以控制绝对是CCD_ 12的论据。我们通过推导从调用到我们库中的所有Java类一个包含类似的公共基类

//  In the Java base class...
private static native void initializeLibrary();
static
{
    System.loadLibrary("WrapperLibrary");
    initializeLibrary();
}

initializeLibrary()函数随后执行显式dlopen