3

我正在尝试将一些用 C++ 编写的现有 Qt 代码与一些使用 Qt Jambi 用 Ja​​va 编写的代码结合起来,但我不太确定如何去做。我基本上试图实现两件事:

  1. 使用 JNI 将 QObject 从 C++ 传递到 Java
  2. 将 Qt Jambi QObject 从 Java 传递到 C++

看起来我可以直接传递指针,然后将其包装在 Java 端的 QNativePointer 中,但我不知道如何将 QNativePointer 转换回由 Qt Jambi 包装的原始对象。

例如:我可以将 QWidget* 作为 long 传递给 Java,然后在 Java 中创建一个 QNativePointer,但是我怎样才能从中构造一个 QWidget?QJambiObject 和 QObject 似乎没有“setNativePointer”方法,我不知道如何转换它。

在 C++ 中:

QWidget* widget = ...
jclass cls = env->FindClass("Test");
jmethodID mid = env->GetStaticMethodID(cls, "test", "(I)V");
env->CallStaticVoidMethod(cls, mid, int(widget));

在 Java 中:

public class Test {
    public static void test (int ptr) {
        QNativePointer pointer = new QNativePointer(QNativePointer.Type.Int);
        pointer.setIntValue(ptr);

        QWidget widget = ...

谢谢!

4

2 回答 2

2

我不希望这是可能的方式,你正在努力实现这一目标。如果我正确理解了您的方法,那么您会以某种方式尝试将 C++ QWidget 对象的内存表示转换为 Java QWidget 对象。这只有在 Java 和 C++ 对象的内存表示相同时才有效,我对此表示严重怀疑。

即使是这种情况,它也可能不起作用,因为我很确定,QWidget 类的 QtJambi 版本不是 C++ QWidget 类的一对一克隆。

为此,您必须以某种方式读取 C++ QWidget 的值,创建一个 QtJambi QWidget 对象,然后将这些值设置为新的 QtJambi 小部件。我不知道有一种转换方法可以完成这项工作,我也不确定这是否可能。

于 2010-01-31T18:01:05.200 回答
1

对于其他正在查看此内容的人,请查看: http: //labs.trolltech.com/blogs/2007/08/24/extremely-interesting-jambi-trick-x-instantiating-java-widgets-from-c/

特别是这部分:

如果父小部件是用 C++ 创建的,则 qtjambi_from_QWidget() 调用将创建一个新的 Java 小部件,或者如果父小部件是用 Java 创建的,它将返回现有的 Java 对象。如果它必须创建一个新的 java 对象,它的类型将是 Qt Jambi 已知的最接近的 Java 超类型。如果您已经映射了自己的 C++ 小部件并希望在此类调用中正确使用它们,则必须确保在转换发生之前调用生成的库的初始化代码。另请注意,在 qtjambi_core.h 中,您会发现其他几个方便的转换函数,可用于在 C++ 和 JNI 之间来回转换,以及其他方便的基于 JNI 的代码。

于 2010-05-11T14:02:52.810 回答