2017-04-24 7 views
0

현재 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을 찾았지만 그것이 정확하게 똑같은 지 확실하지 않습니다.

+0

나에게 좋아 보인다. '$ result'는 바이트 배열에 대한 로컬 참조를 보유하고 있으므로, 로컬 참조 테이블을 채울 위험이있는 루프 (예 : 루프)를 많이 만들지 않으면 명시 적으로 로컬 참조를 삭제하지 않아도됩니다. – Michael

+0

그래서'jenv-> NewByteArray (length)'와'return "'$ result'을 할 때, JVM은 그 메모리의 소유권을 가져 와서 GC 할 것인가? – JBL

+2

일반 네이티브 함수에서 그렇게하면 그렇게됩니다. 따라서 SWIG가 배후에서 전역 참조를 만드는 몇 가지 추가 코드를 삽입하지 않으면이 코드가 제대로 작동한다고 말할 수 있습니다. 'finalize()'를 재정의 한 곳에서 당신이 만든 클래스의'NewObject'를 생성하고 객체가 완성 될 때 기록하는 테스트를 할 수 있다고 가정합니다. – Michael

답변

0

ReleaseByteArrayelementsGetByteArrayElements과 함께 사용되므로 여기서는 필요하지 않습니다.
아무 것도 해제 할 필요가 없습니다. Java 가비지 컬렉터는 일단 참조가 없으면 배열을 해제합니다.