मैं अपने एंड्रॉइड एप्लिकेशन (मूल रूप से क्लाइंट बनाना) में सर्वर संचार के लिए कुछ पहले से लिखित सी ++ कोड का उपयोग करने की कोशिश कर रहा हूं, दुख की बात है कि कोड का तर्क कोड के इस टुकड़े पर निर्भर करता है:

#ifndef LoadLib
#define LoadLib(a) (hmod)dlopen(a, RTLD_NOW)
#endif

कोड से कहा जाता है:

m_hmod = LoadLib(m_namespace::LIBRARY);

जहां LIBRARY = "nameofmylib.so"

समस्या यह है कि जब मैं लोडलिब को कॉल करता हूं, तो मेरा m_var NULL रहता है, जिसका अर्थ है कि यह लाइब्रेरी नहीं ढूंढ सकता (यह मेरा अब तक का अनुमान है) और इसलिए मेरा तर्क सॉकेट से कनेक्ट होने के बजाय त्रुटि प्रबंधन में चला जाता है।

अब तक, मैं StackOverflow पर सर्फिंग कर रहा हूं और लोगों द्वारा ग्रैडल फ़ाइल को बदलने और CMakeList.txt को समायोजित करने के लिए सुझाए गए समाधानों की कोशिश कर रहा हूं, लेकिन कोई काम नहीं हुआ। मैं इसे कुछ घंटों के लिए भी डिबग कर रहा हूं, और मैंने एंड्रॉइड स्टूडियो डिवाइस फ़ाइल एक्सप्लोरर के अंदर .so स्थान की तलाश करने की भी कोशिश की, ताकि मैं पूर्ण पथ में डाल सकूं। लेकिन उसका भी कोई नतीजा नहीं निकला।

लोडिंग का पूरा प्रवाह इस प्रकार है:

#ifndef LoadLib
#define LoadLib(a) (hmod)dlopen(a, RTLD_NOW)
#endif


typedef void * hmod;
hmod m_hmod;

m_hmod = LoadLib(m_namespace::LIBRARY);

if (m_hmod) {
    ... Some code that needs to execute ...
} else {
    ... What actually happens ...
}

जिस कोड के साथ मैं काम कर रहा हूं वह कुछ ऐसा नहीं है जिसे मैंने लिखा है, लेकिन मुझे उस पर टिके रहना है, इस प्रकार मुझे इसे फिर से लिखने और अपना बनाने के बजाय इसके अंदर मौजूद तर्क का उपयोग करने की आवश्यकता है।

1
Falcuun 9 सितंबर 2019, 16:09

1 उत्तर

सबसे बढ़िया उत्तर

सबसे अधिक संभावना है, m_namespace::LIBRARY को APK में पैक नहीं किया जा रहा है। इसे जांचने के लिए, आपको डिवाइस फ़ाइलों की जांच करने की आवश्यकता नहीं है। एंड्रॉइड स्टूडियो आपके एपीके का विश्लेषण करने के लिए एक मेनू कमांड प्रदान करता है।

यदि पुस्तकालय गायब है, तो आपको अपने आप से पूछना चाहिए कि क्या नाम Android नियमों का पालन करता है: यह lib से शुरू होना चाहिए और यह .so के साथ समाप्त होना चाहिए। कोई संख्या प्रत्यय नहीं, कोई अतिरिक्त वर्ण नहीं, और भगवान न करे, कोई रिक्त स्थान नहीं।

यदि पुस्तकालय का नाम ठीक है, लेकिन इसका उपयोग आपकी सीएमके स्क्रिप्ट द्वारा पूर्वनिर्मित किया गया है, तो जांच लें कि यह आपके डिवाइस के एबीआई के लिए उपलब्ध है। साथ ही, सुनिश्चित करें कि इसका पथ jniLibs.src सूची में build.gradle में सूचीबद्ध है।

2
Alex Cohn 9 सितंबर 2019, 17:37