JNI无法释放内存 [英] JNI can't release memory

查看:189
本文介绍了JNI无法释放内存的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是JNI的C ++代码:

This is JNI's C++ code:

extern "C" JNIEXPORT jbyteArray JNICALL
Java_cn_rilled_encoder_JNIEncoder_encodeEncryptBuff(
        JNIEnv* env,
        jobject obj,
        jbyteArray ucInBuffer,
        jintArray unInbufferLen,
        jintArray unOutbufferLen) {

    jbyte *bytes;
    bytes = env->GetByteArrayElements(ucInBuffer, 0);
    int chars_len = env->GetArrayLength(ucInBuffer);
    // chars = new unsigned char[chars_len];
    unsigned char* chars = (unsigned char *) malloc(chars_len);
    memset(chars,0,chars_len);
    memcpy(chars, bytes, chars_len);
    env->ReleaseByteArrayElements(ucInBuffer, bytes, 0);

    int inLength = env->GetArrayLength(unInbufferLen);
    int* inArray = env->GetIntArrayElements(unInbufferLen,0);

    int outLength = env->GetArrayLength(unOutbufferLen);
    int* outArray = env->GetIntArrayElements(unOutbufferLen,0);

    unsigned char* encryptBuff = WCCEncode_Encrypt_Buff(chars, (unsigned int*)inArray, (unsigned int*)outArray);

    jbyteArray bArray=env->NewByteArray(*outArray);

    env->SetByteArrayRegion(bArray, 0, *outArray, (jbyte *)encryptBuff);
    //env->DeleteLocalRef(bArray);
    //env->ReleaseByteArrayElements(bArray, (jbyte *)encryptBuff, 0);
    env->ReleaseIntArrayElements(unInbufferLen, inArray, NULL);
    env->ReleaseIntArrayElements(unOutbufferLen, outArray, NULL);
    free(chars);

    return bArray;
}

这是JNI的Java代码:

This is JNI's Java code:

public class JNIEncoder {

    static {
        System.loadLibrary("native-lib");
    }

    public static native byte[] encodeEncryptBuff(byte[] ucInBuffer, int[] unInbufferLen, int[] unOutbufferLen);

}

在Java线程中调用它:

Call it in java thread:

byte[] result = JNIEncoder.encodeEncryptBuff(content, new int[]{content.length}, outLength);

内存使用情况:

释放字符后的内存使用情况:

memeory usage after freeing chars:

推荐答案

我解决了delete encryptBuff的问题.

...
unsigned char* chars = (unsigned char *) malloc(chars_len);
...
free(chars);
delete encryptBuff;

return bArray;

新内存使用情况:

这篇关于JNI无法释放内存的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆