현재 unsigned char*
을 byte[]
으로 감싸기 위해 SWIG를 사용하고 있습니다. 이 형식을 C++에서 내 코드의 Java 측으로 반환합니다.SWIG out typemap에 할당 된 ByteArray를 해제해야합니까?
이 배열의 메모리를 확보 할 책임이 원시 코드 및/또는 줄 바꿈 또는 Java GC에 있는지 여부는 확실하지 않습니다.
다음%typemap(jni) unsigned char * Image::getPixels "jbyteArray"
%typemap(jtype) unsigned char * Image::getPixels "byte[]"
%typemap(jstype) unsigned char * Image::getPixels "byte[]"
%typemap(javaout) unsigned char * Image::getPixels{
return $jnicall;
}
%typemap(out) unsigned char * Image::getPixels {
//There must be a proper way than using an implicit local variable name
//from the generated cxx file...
size_t length = arg1->getBpp() * arg1->getWidth() * arg1->getHeight();
$result = jenv->NewByteArray(length);
jenv->SetByteArrayRegion($result, 0, length, (const signed char*)$1);
}
에서, NewByteArray
가 야생에서 완전히보고, 난 몰라 :
는 지금은 (... 크기를 얻기 위해 끔찍한 해킹 상관 없어)이 사용하고 있습니다 내가 어디 전화해야하는지 알면 ReleaseByteArrayElemements
. 나는 this answers을 찾았지만 그것이 정확하게 똑같은 지 확실하지 않습니다.
나에게 좋아 보인다. '$ result'는 바이트 배열에 대한 로컬 참조를 보유하고 있으므로, 로컬 참조 테이블을 채울 위험이있는 루프 (예 : 루프)를 많이 만들지 않으면 명시 적으로 로컬 참조를 삭제하지 않아도됩니다. – Michael
그래서'jenv-> NewByteArray (length)'와'return "'$ result'을 할 때, JVM은 그 메모리의 소유권을 가져 와서 GC 할 것인가? – JBL
일반 네이티브 함수에서 그렇게하면 그렇게됩니다. 따라서 SWIG가 배후에서 전역 참조를 만드는 몇 가지 추가 코드를 삽입하지 않으면이 코드가 제대로 작동한다고 말할 수 있습니다. 'finalize()'를 재정의 한 곳에서 당신이 만든 클래스의'NewObject'를 생성하고 객체가 완성 될 때 기록하는 테스트를 할 수 있다고 가정합니다. – Michael