को बंद करने का कारण बनता है मैंने अपने आवेदन में दो देशी पुस्तकालयों (.so) को एकीकृत किया है। पुस्तकालय ठीक संकलित करते हैं और मैं उन्हें अपने आवेदन में भी लोड कर सकता हूं। पहली बार जब मैं लाइब्रेरी की मूल विधि का आह्वान करता हूं तो यह ठीक काम करता है, लेकिन यदि मैं गतिविधि में फिर से एक ही विधि को कॉल करता हूं तो एप्लिकेशन बंद हो जाता है।किसी गतिविधि में तृतीय पक्ष लाइब्रेरी के दो बार देशी विधि को कॉल करने से एंड्रॉइड एप्लिकेशन
समस्यामैं का सामना करना पड़ रहा बिल्कुल वैसा ही जैसा कि यहाँ में उल्लेख किया है:
http://grokbase.com/t/gg/android-ndk/1226m68ydm/app-exit-on-second-native-call
समाधान है कि काम करता है एक और गतिविधि में देशी विधि आह्वान और System.exit के माध्यम से जबरदस्ती उसे बंद करने के लिए है (0) । आलेख के बाद मैंने सफल ऑपरेशन के बाद पॉइंटर्स को कॉल की विधि में सेट करने की कोशिश की, लेकिन इससे भी मेरी मदद नहीं हुई। सिस्टम.लोड लाइब्रेरी() द्वारा लोड होने के बाद भी लाइब्रेरी को अनलोड करना संभव नहीं है।
मैं एक नई गतिविधि के बिना मूल तरीकों से अधिक बार कॉल करना चाहता हूं। इस मुद्दे को हल करने के लिए कोई विचार?
(मैं अंत में एक समाधान नहीं मिला ... यहाँ है)
ठीक है, मैं अंत में इस समस्या को हल करने के लिए एक रास्ता मिल गया है। समाधान वास्तव में बहुत आसान है। अन्य पुस्तकालयों को लोड और अनलोड करने के लिए एक और स्वतंत्र देशी पुस्तकालय (उपयोगिता पुस्तकालय) बनाएं। हमें क्या करना है उपयोगिता की मूल विधि में dlopen() और dlclose() का उपयोग करना है। हम सिस्टम.लोड लाइब्रेरी() के माध्यम से पहले उपयोगिता पुस्तकालय लोड कर सकते हैं।
तो उपयोगिता पुस्तकालय हम क्या करने की जरूरत के मूल विधि में है:
उपयोग #include <dlfcn.h>
// इस dlopen कॉल करने के लिए आवश्यक है() और dlclose() काम करता है।
void *handle;
typedef int (*func)(int); // define function prototype
func myFunctionName; // some name for the function
ओपन dlopen के माध्यम से पुस्तकालय():
हैंडलर और समारोह प्रोटोटाइप प्रदान करें
handle = dlopen("/data/data/my.package.com/lib/somelibrary.so", RTLD_LAZY);
जाओ और पुस्तकालय के समारोह कॉल करें:
myFunctionName = (func)dlsym(handle, "actualFunctionNameInLibrary");
myFunctionName(1); // passing parameters if needed in the call
अब जब कि कॉल किया जाता है इसे dlclose():
dlclose(handle);
आशा है कि इससे अन्य लोगों को एक ही समस्या का सामना करने में मदद मिलेगी।
आप dlclose (हैंडल) कहां करते हैं? मेरा मतलब गतिविधि या जेएनआई कोड में है? –
इसकी जेएनआई कोड में। यह dlfcn.h हेडर फ़ाइल के माध्यम से उपलब्ध एक फ़ंक्शन है। – ZakiMak
ठीक है, मुझे लगता है कि आप इस सी कक्षा में अन्य पुस्तकालयों को लोड और अनलोड करते हैं। लेकिन मुझे इसे अपने जावा कोड से कैसे लिंक करना चाहिए? –