Как исправить утечку памяти, вызванную jni NewByteArray () - PullRequest
0 голосов
/ 06 апреля 2019

Я получил утечку памяти, создав новый байтовый массив с jni.

Я пробовал DeleteLocalRef, DetachCurrentThread и ReleaseByteArrayElements.

int on_header_field(http_parser *parser, const char *at, size_t length) 
{
    int attached = 0;
    int ret;
    jbyteArray data;
    void *tmp;
    HttpConnection *connection = parser->data;
    JavaHttpServer *server = connection->server->data;
    JNIEnv *env;
    if ((*jvm)->GetEnv(jvm, &env, JNI_VERSION_1_8) == JNI_EDETACHED) {
        (*jvm)->AttachCurrentThread(jvm, &env, NULL);
        attached = 1;
    }

    data = (*env)->NewByteArray(env, length);
    tmp = (*env)->GetPrimitiveArrayCritical(env, data, 0);
    memcpy(tmp, at, length);
    (*env)->ReleasePrimitiveArrayCritical(env, data, tmp, 0);
    ret = (*env)->CallIntMethod(env, server->object, server->onHeaderField, (jlong)connection, data);
    (*env)->DeleteLocalRef(env, data);
    if (attached) {
        (*jvm)->DetachCurrentThread(jvm);
    }
    return ret;

}

Эта функция вызывает утечку памяти. Но я не знаю почему.

Я ожидаю, что у меня не будет увеличения памяти, когда я тестирую ее много раз. Я уже тестировал его без этой части кода, и он работал нормально!

...