2009-12-13 2 views
3

Я пытаюсь объединить некоторые существующие Qt-коды, написанные на C++, с кодом, написанным на Java, с использованием Qt Jambi, но я не совсем уверен, как это сделать. Я в основном пытаются добиваться тех двух вещей:Как смешивать объекты Qt Qt и объекты Qt Jambi

  1. Проходят QObject из C++ в Java с помощью JNI
  2. Проходят Qt Джамби QObject из Java в C++

Похоже, что я могу передать указатель напрямую, а затем оберните его в QNativePointer на стороне Java, но я не могу понять, как превратить QNativePointer обратно в исходный объект, завернутый Qt Jambi.

Например: я могу передать QWidget * как длинный Java, а затем создать QNativePointer в Java, но как я могу затем построить 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

Для других людей, глядя на это, проверить это: 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 , то тип этого будет ближайшим Java-супертипом, известным Qt Jambi. Если вы создали свой собственный C++ виджетов и хотите их правильно использовать в таких вызовах, вы должны убедиться, что код инициализации вызвал вашу сгенерированную библиотеку до . Также обратите внимание, что в qtjambi_core.h вы найдете найти несколько других удобных функций преобразования , которые можно использовать для конвертирования между C++ и JNI, а также других удобных, JNI-кода.

2

Я бы не ожидал, что это возможно на пути, вы пытаетесь достичь этого. Если я правильно понимаю ваш подход, вы каким-то образом пытаетесь передать представление объекта C++ QWidget в памяти объекта Java QWidget. Это может работать только в том случае, если представление объектов Java и C++ в памяти будет одинаковым, и я серьезно сомневаюсь.

Даже если бы это было так, это, вероятно, тоже не работало, потому что я уверен, что QtJambi версия класса QWidget не является одним к одному из класса C++ QWidget.

Для этого вам нужно как-то прочитать значения QWidget C++, создать Qwjbi Qwidget-объект и затем установить эти значения в новый виджет QtJambi. Я не знаю о методе конверсии, который бы выполнял эту работу, и я не уверен, что это возможно вообще.

+1

На самом деле, в старой версии Qt Jambi (я не помню, какой из них), theres fromNativePointer() или что-то подобное в QJambiObject, который «кажется» как то, что я хочу. В новейших версиях, похоже, это недокументировано. Был занят другими вещами и еще не успел проверить его, хотя ... – Dan

+1

Из того, что я могу сказать, виджет Jambi обертывает собственный виджет, проксируя метод вызова собственного виджета с помощью внутреннего указателя. В Jambi все QObjects происходят из QJambiObject, которые также содержат QNAtivePointer. Возможно, я ошибаюсь, но похоже, что это так. Генератор Jambi полностью закрывает виджеты (есть некоторые вещи, которые необходимо выполнить вручную). – Dan

+0

Ах, я забыл, что каждый объект QtJambi фактически должен иметь ссылку на соответствующий объект C++ Qt. Так что на самом деле методы, о которых вы говорили, могут работать. Но сомнительно, что эти методы задокументированы, если они уже не документированы сейчас, в ближайшем будущем, столкнувшись с фактом, что Trolltech отказался от проекта QtJambi и в настоящее время пытается преобразовать его в проект на базе сообщества. – Customizer