2016-02-24 16 views
10

के साथ एंड्रॉइड स्टूडियो में मूल प्रीबिल्ट साझा लाइब्रेरी मैं एंड्रॉइड स्टूडियो में अपनी प्रोजेक्ट में देशी प्रीबिल्ट साझा लाइब्रेरी जोड़ने की कोशिश कर रहा हूं। मैं ग्रेडल-प्रयोगात्मक का उपयोग कर रहा हूं: 0.6.0-अल्फा 5। बहरहाल, जब भी मैं अपने आवेदन मॉडल के लिए पहले से बनाए गए साझा लाइब्रेरी जोड़ने का प्रयास करते हैं, मैं निम्नलिखित त्रुटि मिलती है:एंड्रॉइड स्टूडियो में प्रायोगिक ग्रेडल प्लगइन

Error:Cause: org.gradle.api.internal.PolymorphicDomainObjectContainerConfigureDelegate

पुस्तकालय आवेदन मॉडल है कि यह कैसे Google Gradle Experimental Guide द्वारा वर्णित है में जोड़ा जाता है:

repositories { 
    prebuilt(PrebuiltLibraries) { 
     binaries.withType(SharedLibraryBinary) { 
      sharedLibraryFile = file("/path_to_libs/${targetPlatform.getName()}/shared_lib.so") 
     } 
    } 
} 

android.sources { 
    main { 
     jniLibs { 
      dependencies { 
       library "shared_lib" 
      } 
     } 
    } 
} 

महत्वपूर्ण लाइन लाइब्रेरी "shared_lib" है। अगर मैं इस लाइन को अनमोल करता हूं तो कोई त्रुटि नहीं है।

चूंकि यह काम नहीं कर रहा है, इसलिए मैंने ph0b.com से मार्गदर्शिका का उपयोग करने का भी प्रयास किया है। वे देशी साझा पुस्तकालयों को जोड़ने के लिए एक अलग सिंटैक्स का उपयोग कर रहे हैं (मैं सिर्फ हेडर बाहर छोड़ दिया के बाद से मैं सभी हेडर के साथ एक ही निर्देशिका नहीं है):

repositories { 
    libs(PrebuiltLibraries) { 
     shared_lib { 
      binaries.withType(SharedLibraryBinary) { 
       sharedLibraryFile = file("/path_to_libs/${targetPlatform.getName()}/shared_lib.so") 
      } 
     } 
    } 
} 

android.sources { 
    main { 
     jni { 
      dependencies { 
       library "shared_lib" linkage "shared" 
      } 
     } 
    } 
} 

फिर भी, यह रूप में अच्छी तरह से काम नहीं करता। एंड्रॉइड स्टूडियो मेरी साझा_लिब को एपीके फ़ाइल में कॉपी नहीं करता है।

java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader [...] couldn't find "shared_lib.so"

किसी को भी मुझे बता सकते हैं कि कैसे मैं अपने प्रोजेक्ट में देशी prebuild पुस्तकालय शामिल कर सकते हैं: इसलिए, मैं हमेशा निम्न त्रुटि मिल सकता है? मैं बिल्ड पैरामीटर के रूप में buildToolsVersion = '22 .0.1 ' और compileSdkVersion = 22 का उपयोग कर रहा हूं।

+0

क्या आप शायद $ {targetPlatform.getName()} 'के बजाय हार्ड कोड किए गए पथ के साथ प्रयास कर सकते हैं? – RaGe

+0

हां, मैंने पहले से ही कोशिश की है। यदि मैं एक अस्तित्वहीन फ़ाइल के पथ को बदलता हूं तो मुझे त्रुटि मिल सकती है क्योंकि ग्राडल निश्चित रूप से पथ को हल कर सकता है। अगर मेरी समस्या का समाधान हो तो मैं अभी भी खुश रहूंगा। हालांकि, मैंने अस्थायी रूप से प्रीबिल्ट पुस्तकालयों का उपयोग न करके मेरी समस्या का समाधान किया। मैंने अपनी सभी आवश्यक शीर्षलेख फ़ाइलों को 'cppFlags.add ("- I $ {file (" ./../../../ परियोजनाओं/परीक्षण/शामिल करें ")} के साथ जोड़ा।" ToString())' और सीपीपी 'srcDirs + =" ./../../../ परियोजनाओं/परीक्षण/src/"' jni के साथ फाइलें। लेकिन यह अभी भी प्रीबिल्ट पुस्तकालयों का उपयोग करने में सक्षम होना बेहतर होगा। – budderick

+0

क्या आप '--stacktrace' के साथ चल सकते हैं और अधिक त्रुटि प्राप्त कर सकते हैं? – RaGe

उत्तर

7

यह मेरे लिए काम करता है (0.6.0-बीटा 6)।

repositories { 
    prebuilt(PrebuiltLibraries) { 
     YourLib { 
      binaries.withType(SharedLibraryBinary) { 
       sharedLibraryFile = file("src/main/libs/armeabi-v7a/libYourLib.so") 
      } 
     } 
    } 
} 

android.sources { 
    main { 
     jniLibs { 
      dependencies { 
       library "YourLib" 
      } 
     } 
    } 
} 

ऐसा लगता है कि वे सिर्फ "YourLib {}" के आसपास "binaries.withType" भाग उल्लेख करना भूल गया।

+0

धन्यवाद! यह मेरे लिए ग्रेडल-प्रयोगात्मक पर काम करता है: 0.6.0 – Xuelong

+0

मैं इसे सामान्य समस्या के समाधान के रूप में चिह्नित करूंगा। @Zhur का वाक्यविन्यास सही है। हालांकि, मुझे लगता है कि असंतुष्ट लिंक्स त्रुटि एक और जटिल त्रुटि है जिसका ज्यादातर ग्रैडल फ़ाइल से कोई लेना देना नहीं है। – budderick

+0

@budderick इसमें है: गलत गलती फ़ाइल के कारण साझा लाइब्रेरी एपीके में नहीं जा रही है। तो रनटाइम पर लिंकर उस लाइब्रेरी को नहीं ढूंढ सकता और अपवाद फेंकता है। – zhur

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