2009-12-13 3 views
3

Qt Jambi를 사용하여 Java로 작성된 일부 코드와 C++로 작성된 기존 Qt 코드를 결합하려고하는데, 어떻게해야하는지 잘 모르겠습니다. 나는 기본적으로 두 가지 acieve하기 위해 노력하고있어 : 자바에서에 Qt는 잠비 QObject를 전달 C++ Qt 오브젝트와 Qt Jambi 오브젝트를 혼합하는 방법

  • JNI
  • 을 사용하여 자바 C에서 QObject를 ++를 통과

    1. 를 C++

    난을 전달할 수 있습니다처럼 보이는 포인터를 직접 가져온 다음 Java 측의 QNativePointer로 래핑하지만 QNativePointer를 QT Jambi로 래핑 된 원래 객체로 다시 변환하는 방법을 알 수는 없습니다.

    예 : Java에서 QWidget *을 long으로 전달한 다음 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)); 
    

    :

    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() 호출 을 것 중 하나 부모 위젯이 있다면 새로운 자바 위젯을 만들 C++로 생성되었거나 부모가 Java로 작성된 경우 기존 Java 오브젝트를 리턴합니다. 새 Java 오브젝트를 작성해야하는 경우, 이는 Jambi로 알려진 가장 가까운 Java 4 퍼 유형입니다. 자신의 C++ 위젯을 매핑하고 이들과 같은 호출에서 올바르게 을 사용하려면 초기화 코드가 생성 된 라이브러리가 보다 먼저 호출되어야합니다. 변환이 수행됩니다. 또한 은 qtjambi_core에 있습니다.h 다른 편리한 변환 기능을 사용하면 C++ 과 JNI 사이에서 앞뒤로 변환 할 수 있으며 기타 편리한 JNI 기반 코드를 찾을 수 있습니다.

    2

    나는 이것이 가능한 방법이라고 생각하지 않을 것입니다. 접근 방식을 올바르게 이해했다면 C++ QWidget 객체의 메모리 내 표현을 Java QWidget 객체로 캐스팅하려고합니다. 이것은 Java와 C++ 객체의 메모리 내 표현이 동일 할 경우에만 작동 할 수 있습니다. 이는 심각하게 의심 스럽습니다.

    QWidget 클래스의 QtJambi 버전이 C++ QWidget 클래스의 일대일 복제본이 아니기 때문에 그러한 경우에도 실제로 작동하지 않습니다.

    이 작업을하려면 C++ QWidget의 값을 읽고 QtJambi QWidget 객체를 만든 다음이 값을 새로운 QtJambi 위젯으로 설정해야합니다. 나는이 일을 할 수있는 전환 방법을 알지 못하고 있으며, 그것이 가능하다면 나는 확신 할 수 없다. 이보고 다른 사람들을 위해

    +1

    실제로 Qt Jambi의 이전 버전에서는 (from dohand가 기억이 안납니다.) fromNativePointer() 또는 QJambiObject에서 비슷한 점을 발견했습니다. 최신 버전에서는 문서화되지 않은 것으로 보입니다. 다른 것들로 바쁘고 아직 그것을 테스트 할 기회가 없었습니다 ... – Dan

    +1

    Jambi 위젯은 내부 위젯을 통해 네이티브 위젯에 대한 메소드 호출을 프록시하여 네이티브 위젯을 래핑합니다. 잠비에서는 모든 QObject가 QJambiObject에서 파생됩니다.이 QJambiObject도 QNAtivePointer를 포함합니다. 내가 틀렸을 수도 있지만, 그 경우처럼 보입니다. Jambi Generator는 위젯을 거의 자동으로 랩핑합니다 (수동으로 수행해야하는 작업이 일부 있음). – Dan

    +0

    아, 모든 QtJambi 객체가 실제로 해당 C++ Qt 객체에 대한 링크가 있어야한다는 요점을 잊어 버렸습니다. 그래서 실제로 언급 한 방법이 효과가 있습니다. 그러나 Trolltech이 QtJambi 프로젝트를 포기하고 현재이 프로젝트를 커뮤니티 기반 프로젝트로 변환하려고 시도하고 있다는 사실을 알게되면 가까운 장래에 이러한 방법이 문서화되지 않는다면 문서화되는 것은 의심 스럽습니다. – Customizer