我有一个名为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.
有人可以帮助我吗?
答案 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
,以依赖关系确定的顺序。