3

Android JNI に Java 配列を割り当てる関数を書きました。ただし、Java からこの関数を連続して呼び出すと、エラー[*Fatal signal 11 (SIGSEGV)]が発生します。

C++

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;
}

ジャワ

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

このように使うべきではありませんか?それとも何か対策はありますか?

4

1 に答える 1

4

JNI呼び出し間でjbyteArray(jbyteArrayなど)を保持する場合は、GlobalRefにする必要があります。

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

その場合にのみ、オブジェクトを削除してメモリを解放することを忘れないでください。

env->DeleteGlobalRef(buffer);
于 2012-11-02T18:04:55.003 に答える