2014-10-21 8 views
5

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

मेरे मुख्य एंड्रॉइड प्रोजेक्ट के साथ मेरे कोड में इस जार फ़ाइल को संदर्भित करने और इसकी कक्षाओं का उपयोग करने का कोई तरीका है?

स्पष्ट होने के लिए मैं एक बार संकलित होने पर मुख्य परियोजना में जार जोड़ना नहीं चाहता हूं।

संपादित करें: मैंने नीचे दिए गए लिंक को आजमाया है और ऐसा लगता है कि मैंने क्लास फ़ाइल लोड की है। लेकिन मैं गतिशील रूप से लोड कक्षा के लिए कन्स्ट्रक्टर तर्क को परिभाषित करने के तरीके को समझ रहा हूं।

android-custom-class-loading-sample

EDIT2

लगभग वहाँ

। मैंने पुष्टि की है कि वर्ग मेरी कक्षाओं से भरा हुआ है .jar। हालांकि मैं इसे तत्काल अटक गया हूँ।

लाइसेंस पर ValalidatorClazz.getConstructor लाइन मुझे नीचे त्रुटि मिलती है। मुझे लगता है कि मुझे अपनी इंटरफेस फ़ाइल से कुछ याद आ रही है?

java.lang.NoSuchMethodException: [इंटरफ़ेस com.google.android.vending.licensing.Policy, इंटरफ़ेस com.google.android.vending.licensing.DeviceLimiter, इंटरफेस com.google.android.vending.licensing.LicenseCheckerCallback, पूर्णांक, वर्ग java.lang.String, वर्ग java.lang.String]

public Class licenseValidatorClazz = null; 
    public LicenseValidator validator; 

    ... 

    // Initialize the class loader with the secondary dex file. 
    DexClassLoader cl = new DexClassLoader(dexInternalStoragePath.getAbsolutePath(), 
    optimizedDexOutputPath.getAbsolutePath(), 
    null, 
    mContext.getClassLoader()); 

     try { 
      // Load the library class from the class loader. 
      licenseValidatorClazz = cl.loadClass("com.google.android.vending.licensing.LicenseValidator"); 

      validator = (LicenseValidator) licenseValidatorClazz.getConstructor(Policy.class,DeviceLimiter.class,LicenseCheckerCallback.class,int.class,String.class,String.class).newInstance(ddd, new NullDeviceLimiter(), 
        callback, generateNonce(), mPackageName, mVersionCode); 

     } catch (Exception exception) { 
      // Handle exception gracefully here. 
      exception.printStackTrace(); 
     } 

मैं एक अंतरफलक जो भरी हुई वर्ग के लिए पारित करने के लिए काम करता है शामिल है।

public interface LicenseValidator 
{ 
    public LicenseCheckerCallback getCallback(); 
    public int getNonce(); 
    public String getPackageName(); 
    public void verify(PublicKey publicKey, int responseCode, String signedData, String signature); 
    public void handleResponse(int response, ResponseData rawData); 
    public void handleApplicationError(int code); 
    public void handleInvalidResponse(); 
} 
+0

जो उपकरण का निर्माण कर रहे हैं आप उपयोग कर रहे हैं? – AesSedai101

+0

मैं एंड्रॉइड स्टूडियो का उपयोग कर रहा हूं। – zeroprobe

उत्तर

4

एक बाहरी जार का उपयोग अपने आवेदन के साथ जुड़े होने और रनटाइम के दौरान इसका इस्तेमाल करने के लिए, यह Dalvik प्रारूप में होना के बाद से सामान्य जार dalvikVM के तहत काम नहीं कर सकता की जरूरत है।

  1. , dx उपकरण
  2. का उपयोग कर aapt cmd का उपयोग कर अपनी फ़ाइलें कन्वर्ट अपने जार फाइल करने के लिए उन classes.dex जोड़ें।
  3. अब यह जार जिसमें दल्विक प्रारूप में फाइलें शामिल हैं, हमारी परियोजना में लोड की जा सकती हैं।

Here एक पोस्ट है जो इसे पूरा करने की प्रक्रिया को बताती है।

+0

डीएक्स उपकरण का उपयोग करने के लिए प्रबंधित। मुझे लगता है कि मैं एक साधारण वर्ग के साथ ठीक रहूंगा। लेकिन मैं एंड्रॉइड एलवीएल लाइब्रेरी का हिस्सा एक जार में ले जाने की कोशिश कर रहा हूं। काफी मुश्किल लगता है। – zeroprobe

0

आप सेवा API बाहर की कोशिश करनी चाहिए - java.util.ServiceLoader

आप एक सेवा इंटरफ़ेस और अपने जार में इसके कार्यान्वयन परिभाषित करते हैं।

package com.my.project; 
public interface MyService { ... } 
public class MyServiceBarImpl implements MyService { ... } 
public class MyServiceFooImpl implements MyService { ... } 

फिर आप मेटा-आईएनएफ/सेवाओं/निर्देशिका में जार फ़ाइल में निहित सेवाओं को परिभाषित करते हैं। उदाहरण के लिए, 'मेटा-आईएनएफ/सेवाओं/com.my.project.MyService' फ़ाइल में, आप प्रदाता कक्षाओं को सूचीबद्ध करते हैं।

for (MyService service : ServiceLoader.load(MyService.class)) { 
    //Perform some test to determine which is the right MyServiceImpl 
    //and then do something with the MyService instance 
} 

इन उदाहरणों एपीआई से अधिक या कम सीधे लिया जाता है, हालांकि मुझे बदल दिया है:

# Known MyService providers. 
com.my.project.MyServiceBarImpl # The original implementation for handling "bar"s. 
com.my.project.MyServiceFooImpl # A later implementation for "foo"s. 

फिर, अपने मुख्य codebase में, आप एक MyService उदाहरण ServiceLoader साथ दृष्टांत कर सकते हैं पैकेज नाम उन्हें पढ़ने के लिए थोड़ा कम परेशान करने के लिए।

1

इसे पूरा करने के लिए कुछ कदम हैं।

  1. आप अपने आवेदन के निजी आंतरिक संग्रहण में अपने JAR फ़ाइल की एक प्रतिलिपि बनाने के लिए है।

    1. एंड्रॉयड फ़ोल्डर के अंदर dx उपकरण का उपयोग करके आप JAR फ़ाइल से संबद्ध एक classes.dex फाइल उत्पन्न करने के लिए है। dx उपकरण स्थान /android-sdks/build-tools/19.0.1 में हो जाएगा (इस फ़ाइल Dalvik वी एम के लिए आवश्यक है, बस जार Dalvik वी एम द्वारा पढ़ा नहीं जा सकता))

    2. का उपयोग करना एप टूल कमांड जो एक ही स्थान के अंदर है, आपको jars फ़ाइल में classes। dex जोड़ना होगा।

This JAR फ़ाइल गतिशील DexClassLoader का उपयोग कर लोड किया जा सकता है।

यदि आप किसी भी व्यक्ति से अपनी जेएआर बना रहे हैं, तो आपको अपने पुस्तकालय स्रोत कोड में बदलाव होने पर हर बार यह कदम (1-4) करना होगा। तो आप शैल स्क्रिप्ट (मैक/लिनक्स/उबंटू में) या बैच स्क्रिप्ट (विंडोज़ में) बनाकर इन चरणों को स्वचालित कर सकते हैं। शैल स्क्रिप्ट लिखने के तरीके को समझने के लिए आप इस लिंक को रेफर कर सकते हैं।

नोट: इस विधि को लागू करने के लिए एक स्थिति है, जब मूल परियोजना के निर्माण पथ पर सीधे JAR फ़ाइलों को जोड़ना असंभव है और रन टाइम पर गतिशील रूप से लोड होने की आवश्यकता है। सामान्य मामलों में जेएआर फाइलों को बिल्ड पथ में जोड़ा जा सकता है।

विस्तृत कोड और कार्यान्वयन के लिए कृपया इस लिंक को देखें।

How to load a jar file at runtime

Android: How to dynamically load classes from a JAR fil ई?

उम्मीद है कि इससे मदद मिलती है !!

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