简体   繁体   English

C ++ JNI本地参考表溢出

[英]C++ JNI local reference table overflow

I'm encountered memory problem. 我遇到内存问题。

here is my code. 这是我的代码。

JNICommunicator.cpp JNICommunicator.cpp

const char *JNICommunicator::changeStringToUTF8(const char* str)
{
     JniMethodInfo t;
    JniHelper::getStaticMethodInfo(t, JNIPakageName, "changeStringToUTF8", "([B)Ljava/lang/String;");
    jbyteArray arr = (t.env)->NewByteArray(strlen(str));
    (t.env)->SetByteArrayRegion(arr,0,strlen(str), (const jbyte*)str);
    jsize arrSize = t.env->GetArrayLength(arr);
    //jbyte *pbyte = (t.env)->GetByteArrayElements(arr, 0);
    jstring returnValue = (jstring)t.env->CallStaticObjectMethod(t.classID,t.methodID,arr);
    // Release
    //t.env->ReleaseByteArrayElements(arr, pbyte, 0);
    t.env->DeleteLocalRef(arr);
    t.env->DeleteLocalRef(t.classID);
    return t.env->GetStringUTFChars(returnValue,0);
}

JNICommunicator.java JNICommunicator.java

public static String changeStringToUTF8(byte[] arr) throws Exception
{       String ansi = new String(arr, "EUC-KR");
    byte[] utf = ansi.getBytes("UTF-8");
    String ret = new String(utf, "UTF-8");      
    return ret;
}

and here is the log. 这是日志。

02-07 12:53:04.195: E/dalvikvm(27764): JNI ERROR (app bug): local reference table overflow (max=512)
02-07 12:53:04.195: W/dalvikvm(27764): JNI local reference table (0x7a5c1d78) dump:
02-07 12:53:04.195: W/dalvikvm(27764):   Last 10 entries (of 512):
02-07 12:53:04.195: W/dalvikvm(27764):       511: 0x4243bf10 java.lang.String "다"
02-07 12:53:04.195: W/dalvikvm(27764):       510: 0x419be8d0 java.lang.Class<java.util.regex.Matcher>
02-07 12:53:04.195: W/dalvikvm(27764):       509: 0x4243c160 java.lang.String "fonts/NanumGothi... (21 chars)
02-07 12:53:04.195: W/dalvikvm(27764):       508: 0x42443240 java.lang.String "다"
02-07 12:53:04.195: W/dalvikvm(27764):       507: 0x4245f370 java.lang.String "졌"
02-07 12:53:04.195: W/dalvikvm(27764):       506: 0x424780d0 java.lang.String "는"
02-07 12:53:04.195: W/dalvikvm(27764):       505: 0x41d7a540 java.lang.String "그"
02-07 12:53:04.195: W/dalvikvm(27764):       504: 0x424a94a0 java.lang.String "다"
02-07 12:53:04.195: W/dalvikvm(27764):       503: 0x424c2200 java.lang.String "뒤"
02-07 12:53:04.195: W/dalvikvm(27764):       502: 0x424deb78 java.lang.String "난"
02-07 12:53:04.195: W/dalvikvm(27764):   Summary:
02-07 12:53:04.195: W/dalvikvm(27764):         3 of java.lang.Class (3 unique instances)
02-07 12:53:04.195: W/dalvikvm(27764):       509 of java.lang.String (509 unique instances)
02-07 12:53:04.195: E/dalvikvm(27764): Failed adding to JNI local ref table (has 512 entries)

I think return value need to memory release in cpp file.. please help! 我认为返回值需要在cpp文件中释放内存..请帮助!

solved by using GetStringUTFChars. 通过使用GetStringUTFChars解决。

const char *JNICommunicator::changeStringToUTF8(const char* str)
{
     JniMethodInfo t;
    JniHelper::getStaticMethodInfo(t, JNIPakageName, "changeStringToUTF8", "([B)Ljava/lang/String;");
    jbyteArray arr = (t.env)->NewByteArray(strlen(str));
    (t.env)->SetByteArrayRegion(arr,0,strlen(str), (const jbyte*)str);
    jsize arrSize = t.env->GetArrayLength(arr);
    //jbyte *pbyte = (t.env)->GetByteArrayElements(arr, 0);
    jstring returnValue = (jstring)t.env->CallStaticObjectMethod(t.classID,t.methodID,arr);
    const char *nativeString = (t.env)->GetStringUTFChars(returnValue, 0);
    // Release
    //t.env->ReleaseByteArrayElements(arr, pbyte, 0);
    t.env->DeleteLocalRef(arr);
    t.env->DeleteLocalRef(t.classID);
    t.env->DeleteLocalRef(returnValue);
    return nativeString;
}

get const char* by using GetStringUTFChars and release jstring . 通过使用GetStringUTFChars获得const char *并释放jstring。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM