【发布时间】:2013-01-26 20:20:26
【问题描述】:
我正在将一个 c++ 应用程序移植到 Java。我使用 SWIG 生成了一些 Java 类和 JNI 包装器。
在 c++ 中,我有一个名为 Lion 的类,它扩展了 Animal 并实现了 Killable。我收到一条警告,说 Java 中不存在多重继承。到目前为止没问题,Lion 只会在我的 Java 类中扩展 Animal。
使用 SWIG 生成的类:
public class Killable {
private long swigCPtr;
protected boolean swigCMemOwn;
public Killable(long cPtr, boolean cMemoryOwn) {
swigCMemOwn = cMemoryOwn;
swigCPtr = cPtr;
}
protected static long getCPtr(Killable obj) {
return (obj == null) ? 0 : obj.swigCPtr;
}
protected void finalize() {
delete();
}
public synchronized void delete() {
if (swigCPtr != 0) {
if (swigCMemOwn) {
swigCMemOwn = false;
cppinterfaceJNI.delete_Killable(swigCPtr);
}
swigCPtr = 0;
}
}
public long getKillableId() {
return cppinterfaceJNI.Killable_getId(swigCPtr, this);
}
public void kill() {
cppinterfaceJNI.Killable_kill(swigCPtr, this);
}
}
public class Lion extends Animal {
private long swigCPtr;
public Lion(long cPtr, boolean cMemoryOwn) {
super(cppinterfaceJNI.Lion_SWIGUpcast(cPtr), cMemoryOwn);
swigCPtr = cPtr;
}
public static long getCPtr(Lion obj) {
return (obj == null) ? 0 : obj.swigCPtr;
}
...
}
现在假设我想要一个 Killable 数组。 由于使用 SWIG 生成的 Java 类存储了指向原始 c++ 类的指针,因此我应该能够执行以下操作:
LinkedList<Killable> list = new LinkedList<Killable>();
Killable k = new Killable(Lion.getCPtr(myLionObject), false);
list.add(k);
System.out.println(k.getKillableId()) // Return a long, no crash here but I got a huge number (wrong number)
k.kill(); // Crash
当我这样做时没有错误,但是当我尝试访问我的对象 k 的方法时,库崩溃了。我认为发生崩溃是因为没有找到正确的实现,但我不明白为什么,因为我提供了一个指向新对象的有效指针。知道为什么会发生崩溃或我可以在这里使用的解决方法吗?
感谢您的帮助
【问题讨论】:
-
你能给出类和方法的描述吗?像 interface Killable { public void kil()}... class Animal 实现 Killable...
-
哦,如果 Lion 实现了 Killable,那么使用 Killable k = new Killable(Lion.getCPtr(myLionObject), false);
-
只是用 cptr 戳一下并不能正确投射。
-
(通常在 SWIG 问题中,minimal、完整的头文件、接口文件和一些完整的、可编译的目标语言代码比仅自动生成的输出和目标语言的片段)