सवाल 64-बिट एंड्रॉइड डिवाइस पर 32-बिट देशी पुस्तकालयों का उपयोग कैसे करें


मैं अपने आवेदन में एक मूल पुस्तकालय का उपयोग करता हूं जो केवल आर्मेबी, आर्मेबी-वी 7 ए और x86 के लिए संकलित है।

जब यह लाइब्रेरी सैमसंग एस 6 जैसे 64-बिट डिवाइस पर लोड की जाती है, तो एप्लिकेशन एक असंतुष्ट लिंक्स त्रुटि के साथ दुर्घटनाग्रस्त हो जाता है

java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.myapp-2/base.apk"],nativeLibraryDirectories=[/data/app/com.myapp-2/lib/arm64, /vendor/lib64, /system/lib64]]] couldn't find "libfoo.so"
    at java.lang.Runtime.loadLibrary(Runtime.java:366)
    at java.lang.System.loadLibrary(System.java:989)

दुर्भाग्यवश पुस्तकालय बंद स्रोत है। 64-बिट लक्ष्यों के साथ लाइब्रेरी को पुन: संकलित किए बिना इसे ठीक करने का कोई तरीका है?


44
2018-06-11 13:54


मूल


क्या आपने देखा stackoverflow.com/q/27712921/603270 तथा stackoverflow.com/a/29329413/603270 ? - shkschneider
मैंने किया। एक एओएसपी पर लागू होता है, दूसरा गतिशील वर्गीकरण के लिए। मेरा मामला वास्तव में बहुत आसान है। लेकिन मुझे अभी पता चला है कि मैं शामिल एक और मूल पुस्तकालय वास्तव में 64-बिट की आपूर्ति करता हूं। इसलिए फाइलें, इसलिए अंतिम एपीके में मेरे / lib फ़ोल्डर में arm64-86 फ़ोल्डर है। शायद यही कारण है कि सिस्टम मानता है, कि मैं सभी मामलों में 64-बिट .so फाइलें प्रदान करता हूं। मैं इस लाइब्रेरी को केवल 32-बिट समर्थन के साथ पुनः संयोजित करने की कोशिश करूंगा और देख सकता हूं कि यह काम करता है या नहीं। - Philipp E.
अच्छी सोच। हमें बताएं (यदि आवश्यक हो तो आप अपने प्रश्न का उत्तर दें)। - shkschneider
tools.android.com/tech-docs/new-build-system/user-guide/... - Junior Buckeridge


जवाब:


जब आप एंड्रॉइड पर एपीके स्थापित करते हैं, तो सिस्टम मूल पुस्तकालय निर्देशिकाओं (armeabi, armeabi-v7a, arm64-v8a, x86, x86_64, mips64, mips) के अंदर देखेगा lib द्वारा निर्धारित आदेश में एपीके का फ़ोल्डर Build.SUPPORTED_ABIS

यदि आपके ऐप में ऐसा होता है arm64-v8a लापता libs के साथ निर्देशिका, गायब libs किसी अन्य निर्देशिका से स्थापित नहीं किया जाएगा, libs मिश्रित नहीं हैं। इसका मतलब है कि आपको प्रत्येक वास्तुकला के लिए अपने पुस्तकालयों का पूरा सेट प्रदान करना होगा।

इसलिए, अपनी समस्या को हल करने के लिए, आप अपने 64-बिट libs को अपने निर्माण से हटा सकते हैं, या केवल 32-बिट आर्किटेक्चर को पैकेज करने के लिए abiFilters सेट कर सकते हैं:

android {
    ....
    defaultConfig {
        ....
        ndk {
            abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
        }
    }
}

119
2018-06-12 09:34



अच्छा लगता है, इस स्निपेट के साथ 64-बिट फ़ोल्डर्स चले गए हैं। एक बार जब मैं 64 बिट फोन को पुन: पेश करने के लिए पा सकता हूं तो मैं उत्तर को स्वीकार कर दूंगा - Philipp E.
tools.android.com/tech-docs/new-build-system/user-guide/... - Junior Buckeridge
त्रुटि प्राप्त करना एनडीके एकीकरण वर्तमान प्लगइन में बहिष्कृत है। नई प्रयोगात्मक प्लगइन की कोशिश करने पर विचार करें। - Umesh Aawte
जोड़ना android.useDeprecatedNdk=true आपकी परियोजना की जड़ पर gradle.properties नाम की एक फ़ाइल में। btw बहिष्कृत एकीकरण का उपयोग करने के बारे में बुरा नहीं लगता है, क्योंकि abiFilters का उपयोग अभी भी एपीके से 64-बिट libs को फ़िल्टर करने के लिए सबसे साफ तरीका है। - ph0b
@ ph0b भयानक समाधान, लेकिन वास्तव में ndk deprecation भाग के बारे में चिंताजनक ... - Leo K