3

C ++で記述された既存のQtコードと、Qt Jambiを使用してJavaで記述されたコードを組み合わせようとしていますが、その方法がよくわかりません。私は基本的に2つのことを達成しようとしています:

  1. JNIを使​​用してC++からJavaにQObjectを渡します
  2. QtJambiQObjectをJavaからC++に渡します

ポインタを直接渡してJava側のQNativePointerでラップできるように見えますが、QtJambiでラップされた元のオブジェクトにQNativePointerを戻す方法がわかりません。

例:QWidget *をJavaにlongとして渡してから、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オブジェクトのメモリ内表現をJavaQWidgetオブジェクトにキャストしようとしています。これは、JavaオブジェクトとC++オブジェクトのメモリ内表現が同じである場合にのみ機能します。これは私が真剣に疑っています。

そうだとしても、QWidgetクラスのQtJambiバージョンがC ++QWidgetクラスの1対1のクローンではないことは確かなので、おそらく機能しないでしょう。

これを機能させるには、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/

特にこの部分:

qtjambi_from_QWidget()呼び出しは、親ウィジェットがC ++で作成された場合は新しいJavaウィジェットを作成するか、親がJavaで作成された場合は既存のJavaオブジェクトを返します。新しいJavaオブジェクトを作成する必要がある場合、このタイプはQtJambiに知られている最も近いJavaスーパータイプになります。独自のC++ウィジェットをマップしていて、これらのような呼び出しでそれらを正しく使用したい場合は、変換が行われる前に、生成されたライブラリの初期化コードが呼び出されていることを確認する必要があります。また、qtjambi_core.hには、C ++とJNIの間で相互に変換するために使用できる他のいくつかの便利な変換関数、および他の便利なJNIベースのコードがあることに注意してください。

于 2010-05-11T14:02:52.810 に答える