부분적으로 새 배열을 채우는 동안 오류가 발생하면 NewObjectArray
의 결과를 어떻게 처리해야합니까?JNI에서 새 객체 배열을 정리하는 올바른 방법
즉, 생성을 중단하고 싶습니다. 배열에 대한 로컬 참조를 삭제하는 것으로 충분합니까? 이것으로 아이들도 제거됩니까?
부분적으로 새 배열을 채우는 동안 오류가 발생하면 NewObjectArray
의 결과를 어떻게 처리해야합니까?JNI에서 새 객체 배열을 정리하는 올바른 방법
즉, 생성을 중단하고 싶습니다. 배열에 대한 로컬 참조를 삭제하는 것으로 충분합니까? 이것으로 아이들도 제거됩니까?
Java 필드에 할당되거나 JNI 함수 반환 값으로 사용되는 경우가 아니면 기본 호출이 반환되면 참조가 자동으로 가비지 수집됩니다. 로컬 참조입니다. JNI 호출 이후에 살지 않습니다.
동일한 주제 (jobjectArray
출시)를 찾아 보면서이 질문을 발견하고 @Seva에서 제공 한 답변이 완전하지 않은 것으로 나타났습니다.
당신 사용하여 다른 모든 LocalRef
처럼 jobjectArray LocalRef
을 삭제할 수 있습니다 물론
env->DeleteLocalRef(the_array);
// OR
(*env)->DeleteLocalRef(env, the_array);
, 다른 LocalRef
으로, 수동 삭제를 피할 수 있고, GC에 의존하는 한 마법을 할 같은 JNI 함수에서 많은 것을 필요로하거나, 예를 들어 새로운 JNI LocalRef
을 할당하는 루프를 실행 중이고 삭제하지 않으면 나쁜 시간을 가질 수 있습니다. 테이블 제한 (꽤 낮은, 512로 설정)입니다.
참고 수동으로 배열 당신이 jobjectArray
에 DeleteLocalRef
기능은 자식 요소를 배출하지 않는 것을 기억해야 참조 삭제하려고하는 경우.
따라서 jobjectArray
을 사용하는 경우 요소를 추적하거나 모든 요소를 반복하고 하나씩 삭제해야합니다.
같은
는 원시적 배열을 이동하지만, 이러한 당신은이env->Release<Primitive>ArrayElements(the_array,
the_elements_to_remove,
release_mode);
// OR
(*env)->Release<Primitive>ArrayElements(env,
the_array,
the_elements_to_remove,
release_mode);
좋아, 그 작동합니다. 나는 그 localref가 다른 localref와 똑같다고 생각하지 않았다. ... duh –