C++JNI本地引用表溢出
C++ JNI local reference table overflow
我遇到内存问题。
这是我的密码。
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
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;
}
这是日志。
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)
我认为返回值需要在cpp文件中释放内存。。请帮忙!
通过使用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;
}
使用GetStringUTFChars
获取const-char*并释放jstring。
相关文章:
- 将对象数组的引用传递给函数
- 什么时候在C++中返回常量引用是个好主意
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 何时在引用或唯一指针上使用移动语义
- 如何在c++中使用引用实现类似python的行为
- 编译C++时未定义的引用
- Ctypes wstring通过引用传递
- 'short int'持有的值溢出,但"自动"不会溢出?
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 大于65535的C++数组[size]引发不一致的溢出
- c++r值引用应用于函数指针
- 理解c++中的引用
- C++取消引用指针.为什么会发生变化
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 强制转换为引用类型
- 引用计数智能指针如何避免或处理引用计数器溢出?
- 通过引用传递大型对象时堆栈溢出
- C++JNI本地引用表溢出