如何混合C ++ Qt对象和Qt Jambi对象

时间:2009-12-13 12:57:26

标签: java c++ qt4 qt-jambi

我正在尝试将一些用C ++编写的现有Qt代码与使用Qt Jambi用Java编写的一些代码结合起来,但我不太清楚如何去做。我基本上试图解决两件事:

  1. 使用JNI将QObject从C ++传递到Java
  2. 将Qt Jambi QObject从Java传递给C ++
  3. 看起来我可以直接传递指针,然后将它包装在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 = ...
    

    谢谢!

2 个答案:

答案 0 :(得分:2)

我不希望这是可能的,你正试图实现这一目标。如果我正确理解您的方法,您就会尝试将C ++ QWidget对象的内存中表示转换为Java QWidget对象。这只能在Java和C ++对象的内存中表示相同的情况下才能工作,我对此非常怀疑。

即使情况确实如此,它也不会起作用,因为我很确定,QWidget类的QtJambi版本不是C ++ QWidget类的一对一克隆。

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

答案 1 :(得分:2)

对于其他人来看这个,请查看: http://labs.trolltech.com/blogs/2007/08/24/extremely-interesting-jambi-trick-x-instantiating-java-widgets-from-c/

特别是这部分:

  

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