2011-12-08 14 views
7

क्या मेरे पास दो जावा क्लास हैं जिनके पास सी कोड संकलित करने के लिए देशी कॉल हैं और मैं उन वर्गों को किसी अन्य वर्ग में कॉल करता हूं? उदाहरण के लिए मेरे पास क्लास ए और क्लास बी है, दोनों मूल कार्यों के लिए कॉल करते हैं।जावा जेएनआई लाइब्रेरी लोड करने के लिए कॉल करें

public class A{ 
    // declare the native code function - must match ndkfoo.c 
    static { 
     System.loadLibrary("ndkfoo"); 
    } 

    private static native double mathMethod(); 

    public A() {} 

    public double getMath() { 
      double dResult = 0; 
      dResult = mathMethod(); 
      return dResult; 
    } 
} 


public class B{ 
    // declare the native code function - must match ndkfoo.c 
    static { 
     System.loadLibrary("ndkfoo"); 
    } 

    private static native double nonMathMethod(); 

    public B() {} 

    public double getNonMath() { 
      double dResult = 0; 
      dResult = nonMathMethod(); 
      return dResult; 
    } 
} 

कक्षा सी तो दोनों कहता है, के बाद से वे दोनों पुस्तकालय लोड करने के लिए एक स्थिर कॉल करने वर्ग सी में उस बात करेंगे: वे इस तरह सेटअप कर रहे हैं? या यह, वर्ग जो लाइब्रेरी का उपयोग करता है करने के लिए कक्षा सी कॉल System.loadLibrary (...?

public class C{ 
    // declare the native code function - must match ndkfoo.c 
    // So is it beter to declare loadLibrary here than in each individual class? 
    //static { 
    // System.loadLibrary("ndkfoo"); 
    //} 
    // 

    public C() {} 

    public static void main(String[] args) { 
     A a = new A(); 
     B b = new B(); 
     double result = a.getMath() + b.getNonMath(); 

    } 
} 

उत्तर

7

नहीं, इससे कोई फर्क नहीं पड़ता। एक ही क्लासलोडर में एक से अधिक बार loadLibrary() को कॉल करना हानिकारक है।

If this method is called more than once with the same library name, 
    the second and subsequent calls are ignored. 
:

Runtime.loadLibrary(String) के लिए दस्तावेज़, जो System.loadLibrary (स्ट्रिंग) द्वारा कहा जाता है से

1

इसका बेहतर है पुस्तकालय लोड करने के लिए बेहतर है। आप पुस्तकालय आप इसे बनाने के लोड फोन करने के लिए है, तो पुस्तकालय लोड किए बिना देशी तरीकों कॉल करने के लिए संभव।

0

की तरह लगता है और NdkFoo वर्ग विवेकपूर्ण होगा, और हर विधि एक देशी एक हो। फिर एक से आप इस्तेमाल कर सकते हैं

NdkFoo.getInstance().mathMethod(); 

और बी कर सकता है

NdkFoo.getInstance().nonMathMethod(); 

यह बैकिंग जावा क्लास नाम के साथ मूल पुस्तकालय नाम बनाने के लिए भी बनाता है।

1

जेनी लिब गतिशील libs हैं। मुझे लगता है कि लोड लोडर द्वारा लोड होने के लिए उन्हें होना होगा। गतिशील पुस्तकालयों के फायदों में से एक यह है कि यदि वे पहले से ही स्मृति में लोड हो चुके हैं, तो उस प्रतिलिपि को पुनः लोड करने के बजाय उपयोग किया जाता है। तो आप दो लोड लाइब्रेरी कॉल का उपयोग कर सकते हैं।

दूसरा मुद्दा यह है कि यदि आप कक्षा सी में लोड लाइब्रेरी कॉल डालते हैं, तो आपने अन्य दो वर्गों के समावेशन को बर्बाद कर दिया है। किसी भी बड़ी परियोजना में, कोई अंततः वर्ग सी के माध्यम से कक्षा के बिना कक्षा ए या कक्षा बी में मूल कॉलों में से एक को कॉल करने जा रहा है। यह इतना अच्छा काम नहीं करेगा।

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