मुझे निम्नलिखित समस्या है, सी ++ से मैं विशाल स्ट्रिंग [] को जावा भेजता हूं। विशाल = अधिकतम 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);
यह एक पाश में हो रहा है तो मैं हर वस्तु मैं डेटाबेस में बचाने के लिए है, तो के रूप में आप कल्पना कर सकते हैं चाहते हैं के लिए यह कर रहा हूँ, यह समय की बहुत सारी happends।
तो मैं वी एम का ध्यान रखते हूँ और हर स्ट्रिंग मैं बनाने के स्थानीय refs हटा सकते हैं, लेकिन अभी भी मुझे मिलता है:
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
कोई भी विचार क्यों अतिप्रवाह हो रहा है के रूप में? मैं क्या गलत कर रहा हूँ?
मैं काफी आश्वस्त हैं कि आप प्रत्येक 'NewStringUTF' के लिए' ReleaseStringUTFChars' कॉल करने की आवश्यकता है, कि क्या आप DeleteLocalRef' बाद में करना 'की परवाह किए बिना। –
क्या यह समझ में आता है? चूंकि मैं vm से jstring तक नहीं पहुंच रहा हूं लेकिन इसे एक भेज रहा हूं ... क्या मुझे स्ट्रिंग में पॉइंटर बनाना होगा और फिर रिलीज करने के लिए पॉइंटर का उपयोग करना होगा StringUtfChars .. – Tancho
आपको केवल 'रिलीज़स्ट्रिंगटफिशर() को कॉल करने की आवश्यकता है 'यदि आपने जावा-स्ट्रिंग से सी-स्ट्रिंग बनाने के लिए पहले' GetStringUTFChars() 'कहा था। यह मामला यहां नहीं है। –