我正在尝试将一些用C ++编写的现有Qt代码与使用Qt Jambi用Java编写的一些代码结合起来,但我不太清楚如何去做。我基本上试图解决两件事:
看起来我可以直接传递指针,然后将它包装在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 = ...
谢谢!
答案 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的代码。