Tôi có vấn đề sau, từ c + + tôi gửi chuỗi lớn [] tới java. lớn = tối đa 20 hàng; Tôi làm như sauAndroid NDK tràn dalvik JNI bảng tham khảo cục bộ
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);
điều này xảy ra trong một vòng lặp vì vậy tôi đang làm nó cho mọi đối tượng tôi muốn lưu trong cơ sở dữ liệu, vì vậy khi bạn có thể tưởng tượng, nó happends rất nhiều lần.
Vì vậy, tôi ân cần của VM và xóa các refs địa phương của mỗi chuỗi tôi tạo ra, nhưng tôi vẫn nhận được:
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
Bất kỳ ý tưởng là tại sao tràn đang xảy ra? Tôi đang làm gì sai?
Tôi khá thuyết phục rằng bạn cần phải gọi 'ReleaseStringUTFChars' cho mỗi' NewStringUTF', bất kể bạn làm 'DeleteLocalRef' sau đó. –
Có hợp lý không? kể từ khi tôi không truy cập một jstring từ vm nhưng gửi một cho nó ... Tôi có phải tạo một con trỏ đến chuỗi và sau đó gọi sử dụng con trỏ để làm releaseStringUtfChars .. – Tancho
Bạn chỉ cần gọi 'ReleaseStringUTFChars() 'nếu trước đó bạn đã gọi' GetStringUTFChars() 'để tạo một chuỗi C từ một chuỗi Java. Đó không phải là trường hợp ở đây. –