8

का उपयोग कर मेरा प्रश्न 64 बिट एंड्रॉइड सिस्टम के लिए देशी एंड्रॉइड विकास की ओर निर्देशित है।एंड्रॉइड एनडीके- multlib समर्थन ग्रेडल

मैं ग्रेडबिल बिल्ड सिस्टम का उपयोग कर 64 बिट एंड्रॉइड सिस्टम पर 32 बिट संकलित देशी पुस्तकालयों के समर्थन को कॉन्फ़िगर करने का एक तरीका ढूंढ रहा हूं। उपयोग किए जाने वाले पुस्तकालयों को केवल 32 बिट बिल्ड के रूप में उपलब्ध होना चाहिए। यह पुस्तकालयों को 64 बिट तक बंद करने में बहुत समय लगेगा और त्रुटि होगी।

इसलिए, मैं इन प्रीबिल्ट 32 बिट बाइनरी को तैनात करने और एंड्रॉइड एप्लिकेशन के 32 बिट संस्करण का उपयोग करने के लिए ग्रेडल को कॉन्फ़िगर करना चाहता हूं।

वर्तमान कॉन्फ़िगरेशन निम्न त्रुटि की ओर जाता है:

E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: <application_name>, PID: 2170 
    java.lang.UnsatisfiedLinkError: 
dalvik.system.PathClassLoader 
[DexPathList[[zip file "/data/app/<application_name>/base.apk"], 
nativeLibraryDirectories=[/vendor/lib64, /system/lib64]]] 
enter code here`couldn't find "libmynativelibrary.so" 
    at java.lang.Runtime.loadLibrary(Runtime.java:366) 

ऐसा लगता है जैसे कि PathClassLoader गलत निर्देशिका में लग रहा है। मैंने प्रदान की गई एपीके फ़ाइल की जांच की है और इसमें पुस्तकालयों की कमी है। एपीके के अंदर कोई lib फ़ोल्डर नहीं है। निर्माण प्रणाली 32 बिट पुस्तकालयों को शामिल करने के लिए सीम नहीं है। चूंकि armv7 के लिए केवल एक प्रीबिल्ड संस्करण है, इसलिए ये पुस्तकालय app/src/main/jnilibs फ़ोल्डर में हैं।

मुझे यह जोड़ना होगा कि यह सेटअप किसी भी 32 बिट एंड्रॉइड सिस्टम के लिए पूरी तरह से काम करता है। मैंने इसे पहले एमुलेटर और एक भौतिक डिवाइस के साथ करने की कोशिश की।

ग्रेडल का उपयोग करके बहुभाषी 32/64 बिट समर्थन को कैसे सक्रिय किया जाना चाहिए? या एंड्रॉइड स्टूडियो/ग्रेडल का उपयोग कर 64 बिट एंड्रॉइड सिस्टम में 32 बिट एप्लिकेशन को तैनात करना कैसे संभव है?

मैंने वेब की खोज की और विषय से संबंधित एक लिंक पाया, लेकिन यह पुराने निर्माण प्रणाली का जिक्र कर रहा है: https://source.android.com/source/64-bit-builds.html। मैं नहीं जानता कि विवरण को अपनाने के लिए कैसे अपनाना है।

मैं एंड्रॉइड स्टूडियो (बिल्ड: 141.1 9 8 9 4 9, 6 जून, 2015) का उपयोग कर रहा हूं। project/build.gradle छूटा हुआ है। app/build.gradle फ़ाइल इस तरह दिखता है:

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 22 
    buildToolsVersion "22.0.1" 

    defaultConfig { 
     applicationId "<application_name>" 
     minSdkVersion 1 
     targetSdkVersion 22 
     versionCode 1 
     versionName "1.0" 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 
               'proguard-rules.pro' 
     } 
     debug { 
      debuggable true 
     } 
    } 

    productFlavors { 
     armv7 { 
      ndk { 
       abiFilter "armeabi-v7a" 
      } 
     } 
     fat 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
} 

उत्तर

1

आदेश 64 बिट एंड्रॉयड प्रणाली के लिए 32 बिट ऐप्लिकेशन नियोजन प्राप्त करने के लिए एक एक armv7 productFlavor और jniLibs फ़ोल्डर इसी वास्तुकला नामकरण के अंदर एक सबफ़ोल्डर को परिभाषित करने की जरूरत है। app/build.gradle में

उत्पाद स्वाद परिभाषा:

android { 
    productFlavors { 
     armv7 { ndk { abiFilter "armeabi-v7a" } } 
     fat 
    } 
} 

मूल निवासी पुस्तकालय संरचना:

app/src/main/jniLibs/armeabi-v7a 
+0

किसी को भी कृपया समझा सकता है इस 'productFlavors' में 'फैट' क्या है और अगर यह अनिवार्य आवश्यकता है? – mithil1501

2

mulilib की अवधारणा केवल परियोजनाओं है कि एक Android प्रणाली के निर्माण का हिस्सा हैं के लिए है और आप तैयार नहीं करना चाहिए एंड्रॉइड: मल्टीआर्क विकल्प क्योंकि आपके पास केवल 32 बिट libs हैं क्योंकि यह विकल्प केवल उन ऐप्स के लिए है जो अन्य स्थापित एप्लिकेशन में 32 और 64 बिट पुस्तकालय दोनों प्रदान कर रहे हैं।

64-बिट एंड्रॉइड सिस्टम सीधे 32-बिट अनुप्रयोगों का समर्थन करते हैं। किसी भी एंड्रॉइड डिवाइस के लिए, आपको केवल एपीके के lib/(armeabi-v7a,x86,...) के अंदर अपनी .so फ़ाइलों के साथ अपने ऐप को उचित रूप से पैकेज करने की आवश्यकता है।

इंस्टॉल समय पर, डिवाइस द्वारा पसंदीदा आर्किटेक्चर की libs स्थापित की जाएगी। यानी: यदि कोई x86_64 फ़ोल्डर नहीं है, तो x86 libs इंस्टॉल हो जाएंगे/यदि कोई arm64-v8a फ़ोल्डर नहीं है, तो armeabi-v7a libs इंस्टॉल हो जाएंगे, और आपका ऐप 32-बिट मोड में चलाएगा।

आप lib के तहत कुछ भी नहीं है, तो इसका मतलब है कि एंड्रॉयड स्टूडियो अपने .so फ़ाइलों के बारे में पता नहीं है। डिफ़ॉल्ट रूप से यह उन्हें jniLibs/(armeabi-v7a,x86,...) के अंदर देखेगा, इसलिए आपको उन्हें अपनी जगह की निर्देशिका में sourceSets.main.jniLibs.srcDir बदलना चाहिए या बदलना चाहिए।

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