2012-11-02 7 views
3

Android JNI에서 Java 배열을 할당하는 함수를 작성했습니다. 그러나이 함수가 Java에서 계속 호출되면 [* Fatal signal 11 (SIGSEGV)] 오류가 발생합니다.JNI에서 할당 한 배열에 대해서

C++

byte[] buf = conv.updateBuffer(buflen); 

static jbyteArray buffer = NULL; 
static int cbuflen = 0; 
jbyteArray Java_com_sample_buffer_Buffer_updateBuffer(JNIEnv* env, jobject thiz, jlong handle, jint buflen) 
{ 
    if(buflen > cbuflen){ 
     if(buffer != NULL) env->DeleteLocalRef(buffer); 
     buffer = env->NewByteArray(buflen); 
     cbuflen = buflen; 
    } 
    return buffer; 
} 

자바 나는이 방법을 사용하지할까요? 아니면 몇 가지 조치가 있습니까?

+0

무엇을 "계속해서 불렀다"는 뜻인가요? 여러 스레드에서 호출하고 있습니까? –

+0

왜? 왜 이것을 JNI에 쓰는거야? Java에서 더 효율적입니다. Java에서 이미이 작업을 수행하는 클래스가 있습니다 (예 : ByteArrayOutputStream. – EJP

답변

4

당신은 JNI 당신이 그것을 globalRef에 할 필요가 호출 사이에 (jbyteArray 같은)하는 jobject을 유지하려면 : 그런 다음에야 remeber 사용 가능한 메모리에 객체를 삭제하려면

jbyteArray temp_buffer = env->NewByteArray(buflen); 
buffer = (jbyteArray)env->NewGlobalRef(temp_buffer); 

을 :

env->DeleteGlobalRef(buffer); 
+0

대단히 도움이됩니다. 고맙습니다. – Tank2005

+0

cf. http://developer.android.com/guide/practices/jni.html#local_and_global_references. 또한 CheckJNI (이 페이지의 뒷부분에서 설명)를 활성화하면 Dalvik은 이와 같은 상황을 볼 때 매우 큰 소리로 불평 할 것입니다. – fadden

+0

@ Mārtiņš Možeiko는 코드에서 자동으로 'temp_buffer'가 실행되거나'env-> DeleteLocalRef (temp_buffer)'가 호출되어야합니까? – Bliss