2008-10-31 4 views
1

네이티브 C++ 라이브러리 (PhysX)를위한 Java 래퍼 인 기존 라이브러리 (JPhysX)가 있습니다. Java 라이브러리는 SWIG에 의해 생성 된 유형을 사용합니다 (예 : com.jphysx.SWIGTYPE_p_NxStream). 이는 C++ 코드의 NxStream 객체에 대한 포인터를 나타냅니다. 이제 C++ 유형 NxStream을 상속받은 내 자신의 C++ 클래스를 만들고 내 클래스의 Java 래퍼도 래퍼 com.jphysx.SWIGTYPE_p_NxStream에서 상속 받도록하고 싶습니다.새로운 것들을 생성 할 때 기존 SWIG 래퍼 참조하기

문제는 내가 내 클래스에 대한 래퍼를 생성하는 꿀꺽 꿀꺽를 호출 할 때, 그것은 또한 com.jphysx의 한 기능적으로 동일 SWIGTYPE_p_NxStream라는 새로운 래퍼를 작성,하지만 여전히 다른 유형까지 자바로 걱정이다.

com.jphysx의 기존 래퍼를 다시 사용하도록 SWIG에 설득하고 대신 내 수준의 래퍼를 com.jphysx.SWIGTYPE_p_NxStream에서 상속 받도록 만들 수 있습니까? 래퍼 클래스를 명시 적으로 원하는 형식에서 상속 만들기

답변

1

이 경우 속임수를 썼는지 :

%typemap(javabase) UserStream "com.jphysx.SWIGTYPE_p_NxStream"; 

가 나는 비슷한 문제를 가지고있는 래퍼 클래스의 몇 가지 방법이 있었다, 그러나 나는 단지에서 그들을 제거 SWIG 인터페이스 파일은 어쨌든 Java 코드에서 호출되지 않기 때문에.

: 이 아닙니다. 래퍼 유형은 다른 래퍼 유형을 상속하므로 갑자기 두 개의swigCPtr 필드가 있습니다. 하위 유형에있는 하나가 초기화되고 상위 유형에있는 하나가 0 ...으로 남아 있지만 이것은 수퍼 유형을 어딘가에서 사용할 때 사용됩니다.

편집 2 : 드디어 SWIGTYPE_p_NxStream 객체에 UserStream 개체를 변환하는 자바 래퍼 클래스에 메서드를 추가하여 문제를 해결 :

이 JNI 방법은 꿀꺽 꿀꺽의 외부에서 손으로 쓴
%typemap(javacode) UserStream %{ 
    public native com.JPhysX.SWIGTYPE_p_NxStream toNxStreamPtr(); 
%} 

물건 :

JNIEXPORT jobject JNICALL Java_physics_UserStream_toNxStreamPtr(JNIEnv *env, jobject userStreamObject) { 
    jclass userStreamClass = env->GetObjectClass(userStreamObject); 
    jmethodID getCPtrMethodID = env->GetStaticMethodID(userStreamClass, "getCPtr", "(Lphysics/UserStream;)J"); 

    jlong cPtr = env->CallStaticLongMethod(userStreamClass, getCPtrMethodID, userStreamObject); 
    jboolean futureUse = false; 

    jclass nxStreamPtrClass = env->FindClass("com/JPhysX/SWIGTYPE_p_NxStream"); 
    jmethodID nxStreamPtrConstructor = env->GetMethodID(nxStreamPtrClass, "<init>", "(JZ)V"); 
    jobject nxStreamPtrObject = env->NewObject(nxStreamPtrClass, nxStreamPtrConstructor, cPtr, futureUse); 
    return nxStreamPtrObject; 
} 
관련 문제