Android NDK 溢出 dalvik JNI 本地引用表

标签 android java-native-interface dalvik android-ndk

我有以下问题,我从 c++ 向 java 发送了巨大的 string[]。巨大 = 最多 20 行; 我正在做以下事情

jint jtype = 2;
jstring emptyString = env->NewStringUTF("");
jobjectArray data = (jobjectArray)env->NewObjectArray(7, env->FindClass("java/lang/String"), emptyString);

env->SetObjectArrayElement( data,0,env->NewStringUTF(item->get_id().c_str());
env->SetObjectArrayElement( data,1,env->NewStringUTF(item->get_number().c_str());
env->SetObjectArrayElement( data,2,env->NewStringUTF(item->get_fullname().c_str());
env->SetObjectArrayElement( data,3,env->NewStringUTF(item->get_mf().c_str());
env->SetObjectArrayElement( data,4,env->NewStringUTF(item->get_dob().c_str());
env->CallVoidMethod(dao, jsaveItem, data, jtype);
int i;
for (i = 0; i < 5; ++i) {
   jstring string = (jstring) env->GetObjectArrayElement(data, i);
   env->DeleteLocalRef(string);
}
env->DeleteLocalRef(emptyString);
env->DeleteLocalRef(data);
env->DeleteLocalRef(dao);

这是在一个循环中发生的,所以我对我想保存在数据库中的每个对象都这样做,所以你可以想象,它发生了很多次。

所以我考虑了虚拟机并删除了我创建的每个字符串的本地引用,但我仍然得到:

 ReferenceTable overflow (max=512)
Last 10 entries in JNI local reference table:
  502: 0x40552880 cls=Ljava/lang/String; (28 bytes)
  503: 0x405528b8 cls=Ljava/lang/String; (28 bytes)
  504: 0x4051f8d0 cls=Ljava/lang/Class; 'Lcom/project/storage/userdata/DataDao;' (212 bytes)
  505: 0x4052eb38 cls=Lcom/project/storage/userdata/DataDao; (12 bytes)
  506: 0x4051f8d0 cls=Ljava/lang/Class; 'Lcom/project/storage/userdata/DataDao;' (212 bytes)
  507: 0x4052eb38 cls=Lcom/project/storage/userdata/DataDao; (12 bytes)
  508: 0x4051f8d0 cls=Ljava/lang/Class; 'Lcom/project/storage/userdata/DataDao;' (212 bytes)
  509: 0x4052eb38 cls=Lcom/project/storage/userdata/DataDao; (12 bytes)
  510: 0x4051f8d0 cls=Ljava/lang/Class; 'Lcom/project/storage/userdata/DataDao;' (212 bytes)
  511: 0x4052eb38 cls=Lcom/project/storage/userdata/DataDao; (12 bytes)
JNI local reference table summary (512 entries):
   58 of Ljava/lang/Class; 212B (1 unique)
    1 of Ljava/lang/Class; 236B
   25 of Ljava/lang/Class; 284B (1 unique)
    1 of Ljava/lang/Class; 572B
  392 of Ljava/lang/String; 28B (392 unique)
    1 of Ljava/lang/String; 36B
    1 of [Ljava/lang/String; 28B
    2 of [Ljava/lang/String; 92B (2 unique)
   31 of Lcom/project/storage/userdata/DataDao; 12B (1 unique)
Memory held directly by tracked refs is 12540 bytes

关于溢出发生的原因有什么想法吗? 我做错了什么?

最佳答案

尝试在使用后立即删除本地引用。像这样:

jstring string;
string = env->NewStringUTF(item->get_id().c_str());
env->SetObjectArrayElement( data,0,string);
env->DeleteLocalRef(string);
string = env->NewStringUTF(item->get_number().c_str());
env->SetObjectArrayElement( data,1,string);
env->DeleteLocalRef(string);
string = env->NewStringUTF(item->get_fullname().c_str());
env->SetObjectArrayElement( data,2,string);
env->DeleteLocalRef(string);
string = env->NewStringUTF(item->get_mf().c_str());
env->SetObjectArrayElement( data,3,string);
env->DeleteLocalRef(string);
string = env->NewStringUTF(item->get_dob().c_str());
env->SetObjectArrayElement( data,4,string);
env->DeleteLocalRef(string);
env->CallVoidMethod(dao, jsaveItem, data, jtype);

我不确定 GetObjectArrayElement() 是返回相同的 localref 还是创建一个新的 localref。如果它正在创建一个新的,那么这将解释为什么您要填写 localref 表。

关于Android NDK 溢出 dalvik JNI 本地引用表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11079912/

相关文章:

android - 在 Android 的 xml 布局中引用来自类的静态字段

android - 为什么我们已经有了/data/dalvik-cache,还要把*.odex文件放在/system/app下?

android - 如何将 openssl RSA key 转换为 Android 引导加载程序 RSA key 格式?

android - 如何从具有 singleInstance 启动模式的 Activity 中正确启动语音识别 Activity ?

java - 从 C++ 应用程序从 Java 调用 C++ 时,如何避免 UnsatisfiedLinkError?

java - 错误 : no classes specified

java - 来自 Java 的 Flandmark

android - 使用 Art 代替 Dalvik 编译

java - 指令 "filled-new-array"什么时候出现?

java - 发送车辆特定的 OBDII 命令