2010-01-21 13 views
5

मैं सिर्फ एंड्रॉयड NDK के साथ काम करना शुरू किया, लेकिन मैं SIGSEGV हो रही जब मैं अपने सी कोड में इस फोन है रखें: सभी उदाहरण मैं पा सकते हैं परAndroid में जेएनआई के लिए NewObjectArray को कॉल करते समय SIGSEGV का कारण क्या हो सकता है?

jobjectArray someStringArray; 
someStringArray = (*env)->NewObjectArray(env, 10, 
(*env)->FindClass(env,"java/lang/String"),(*env)->NewStringUTF(env, "")); 

बेस, ऊपर कोड सही है, लेकिन मैं मिलती रहती है SIGSERGV और सबकुछ ठीक है अगर NewObjectArray लाइन पर टिप्पणी की जाती है। कोई विचार क्या ऐसी समस्या पैदा कर सकता है?

+0

उल्लेख करना भूल गए, मैं एनडीके 1.6 का उपयोग कर रहा हूं – Ken

उत्तर

4

जो सही दिखता है, इसलिए मुझे लगता है कि आपने कुछ और गलत किया है। मुझे लगता है कि आप चेकजनी के साथ चल रहे हैं? आप इसे कई पंक्तियों में तोड़ना चाहेंगे: FindClass करें और वापसी मान जांचें, NewStringUTF करें और वापसी मान जांचें, और फिर NewObjectArray को कॉल करें।

बीटीडब्ल्यू, आप अंतिम तर्क के रूप में न्यूल को पास करना चाहते हैं; सरणी के प्रत्येक तत्व के लिए डिफ़ॉल्ट मान के रूप में रिक्त स्ट्रिंग का उपयोग करने का यह पैटर्न आमतौर पर उपयोग किया जाता है (मुझे लगता है कि यह कुछ सूर्य प्रलेखन से चिपका हुआ & है और वहां से फैल गया है) लेकिन यह शायद ही कभी उपयोगी है, और यह थोड़ा अपर्याप्त है। (और यह जावा में "नई स्ट्रिंग [10]" के व्यवहार से मेल नहीं खाता है।)

2

मुझे लगता है कि संभावित कारणों में से एक यह है कि लंबे समय से चलने वाली जेएनआई विधि में, वीएम समाप्त होने पर बंद हो जाता है प्रति-विधि-आमंत्रण स्थानीय संदर्भ स्लॉट (आमतौर पर एंड्रॉइड में 512 स्लॉट)।

चूंकि FindClass() और NewStringUTF() फ़ंक्शंस स्थानीय संदर्भ आवंटित करेंगे, यदि आप लंबे समय तक जेएनआई विधि में रहते हैं, तो वीएम नहीं जानता कि कोई विशिष्ट स्थानीय संदर्भ पुनर्नवीनीकरण किया जाना चाहिए या नहीं। तो आपको अधिग्रहण किए गए स्थानीय संदर्भों को रिलीज़ करने के लिए अब DeleteLocalRef() को स्पष्ट रूप से कॉल करना चाहिए जब आवश्यक नहीं है। यदि आप ऐसा नहीं करते हैं, तो "ज़ोंबी" स्थानीय संदर्भ VM में स्लॉट पर कब्जा करेंगे, और सभी स्थानीय संदर्भ स्लॉट से बाहर चलते समय वीएम aborts।

लघु-संचालित जेएनआई विधि में, यह कोई समस्या नहीं हो सकती है क्योंकि जेएनआई विधि से बाहर निकलने पर सभी स्थानीय संदर्भों का पुनर्नवीनीकरण किया जाएगा।

संबंधित मुद्दे