새 스파이 래퍼를 작성할 때 기존 SWIG 포장지를 참조합니다
문제
기존 C ++ 라이브러리 (Physx)를위한 Java 래퍼 인 기존 라이브러리 (JPhysx)가 있습니다. Java 라이브러리는 예를 들어 SWIG에 의해 생성 된 유형을 사용합니다.
, 이는 An에 대한 포인터를 나타냅니다 com.jphysx.SWIGTYPE_p_NxStream
NxStream
C ++ 코드의 개체. 이제 C ++ 유형에서 상속되는 내 자신의 C ++ 클래스를 만들고 싶습니다. NxStream
, 그리고 내 수업을위한 Java 래퍼도 래퍼에서 상속받습니다.
.com.jphysx.SWIGTYPE_p_NxStream
문제는 수업을 위해 래퍼를 생성하기 위해 Swig에 전화를 걸 때 새로운 래퍼를 만든다는 것입니다.
, 기능적으로 동일합니다 SWIGTYPE_p_NxStream
, 그러나 Java에 관한 한 여전히 다른 유형입니다.com.jphysx
Swig 가이 기존 래퍼를 재사용하도록 어떻게 설득 할 수 있습니까? com.jphysx
그리고 내 수업의 래퍼를 상속받습니다
대신에?com.jphysx.SWIGTYPE_p_NxStream
해결책
래퍼 클래스가 원하는 유형에서 명시 적으로 상속되도록하는 것은이 경우 트릭을 수행했습니다.
%typemap(javabase) UserStream "com.jphysx.SWIGTYPE_p_NxStream";
래퍼 클래스에는 비슷한 문제가있는 몇 가지 방법이 있었지만 어쨌든 Java 코드에서 호출되지 않기 때문에 SWIG 인터페이스 파일에서 간단히 제거했습니다.
편집하다: 이건 그렇습니다 ~ 아니다 일하다. 래퍼 유형은 다른 래퍼 유형에서 상속되기 때문에 갑자기 둘 swigCPtr
필드. 하위 유형의 하나는 초기화되고, 슈퍼 유형의 하나는 남아 있습니다. 0
...하지만 이것은 슈퍼 타입을 어딘가에 사용할 때 사용되는 것입니다.
편집 2: 마침내 Java Wrapper 클래스에 메소드를 추가하여 변환하여 문제를 해결했습니다. UserStream
A에 반대 SWIGTYPE_p_NxStream
물체:
%typemap(javacode) UserStream %{
public native com.JPhysX.SWIGTYPE_p_NxStream toNxStreamPtr();
%}
이 JNI 방법은 Swig의 것들 밖에서 손으로 쓴 것입니다.
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;
}