2013-02-19 61 views
7

मैं कुछ सी कोड लिखना चाहता हूं (ठीक है अगर यह केवल लिनक्स पर काम करता है) गतिशील रूप से एक नई साझा लाइब्रेरी लोड करने के लिए, और उसके बाद से एक विधि (रनटाइम पर निर्धारित करने के लिए) का आह्वान करें। ऐसा लगता है कि यह पहले से ही संभव है क्योंकि जावा मूल पुस्तकालयों को गतिशील रूप से लोड कर सकता है, और फिर उनसे तरीकों का आह्वान कर सकता है।मैं अपनी लाइब्रेरी को गतिशील रूप से कैसे लोड करूं, और इसमें एक विधि का आह्वान कैसे करूं?

int main() { 
    libinfo_t * lib_details = load_shared_library("libfoo.so"); 
    run_method(lib_details, "bar", 7); 
} 

यह तर्क 7 (बार एक विधि libfoo.so में संकलित किया है) के साथ विधि 'बार' आह्वान होगा:

उदाहरण के लिए, मैं की तरह कुछ करने के लिए करना चाहते हैं।

उपयोग मामले का विवरण:

मैं एक द्विआधारी है कि एक निर्देशिका में सभी साझा पुस्तकालयों लोड करता है, और प्रत्येक से कुछ विधि चलाता संकलित करने के लिए, मूल कार्यक्रम की स्मृति संदर्भ में करना चाहते हैं। मैं एक निर्देशिका से इसे जोड़ने/हटाने के द्वारा साझा लाइब्रेरी को त्वरित रूप से सक्षम या अक्षम करने में सक्षम होना चाहता हूं। अवधारणा के

सबूत:

ऐसा लगता है इस तरह से जावा गतिशील JNI कोड के साथ लिंक करने के लिए प्रबंधन करता है के आधार पर, संभव हो जाना चाहिए। आप System.load() का उपयोग कर सकते हैं, और अपनी पसंद की लाइब्रेरी लोड कर सकते हैं। स्मृति से संकलन के साथ मिलकर, ऐसा लगता है कि यह आपको मनमाने ढंग से लाइब्रेरी से मनमाने ढंग से कार्य करने की अनुमति देगा। http://www.java2s.com/Code/Java/JDK-6/CompilingfromMemory.htm

बातें मैं कोशिश की है:

  1. मैं 'uselib' है, जो उपयोगी प्रतीत होता है के लिए मैनपेज देखा है, लेकिन मैं पुस्तकालय के साथ क्या करना है एक बार मैंने यकीन नहीं है इसे लोड किया

  2. कुछ गुगलिंग http://dyncall.org/ लौटा दी, लेकिन यह वही नहीं है जो मुझे चाहिए - इस परियोजना को अभी भी फ़ंक्शन कॉल करने के लिए फ़ंक्शन पॉइंटर की आवश्यकता है।

मैं किसी भी संकेतक के लिए आभारी हूं कि बिना किसी ठोस उत्तर के, यहां तक ​​कि कहां देखना है। धन्यवाद!

+0

सी के पास विधियां नहीं हैं लेकिन कार्य नहीं हैं। –

उत्तर

9

लिनक्स के लिए इसके लिए एक बहुत ही संपूर्ण API है। यह dlopen(3) एपीआई है।

सबसे पहले, आप किसी साझा लाइब्रेरी संभाल पाने के लिए एक फ़ाइल नाम के साथ dlopen फोन: इस सूचक

int (*func)() = dlsym(lib, "thing"); 

उपयोग:

void* lib = dlopen("./lib.so"); 

से, इस पुस्तकालय में एक समारोह के लिए एक समारोह सूचक प्राप्त करने के लिए जैसा आप चाहें।

अंत में, यह करने के बाद:

dlclose(lib) 

नोट: त्रुटि जाँच करने के लिए याद रखें!

+1

वाह, तेज़ उत्तर के लिए धन्यवाद! मैं जो खोज रहा था उसकी तरह लगता है। – jstrom

+1

@jstrom: ज़रूर! मदद करने में खुशी। वैसे, एसओ में आपका स्वागत है! अच्छा पहला सवाल। आशा है कि आप वापस आओ! ऐसा लगता है कि आप अकसर किये गए सवाल पढ़ते हैं - हाँ! :)। – Linuxios

+2

आप पथ में '/' रखना चाहते हैं, उदाहरण के लिए 'dlopen ("./ lib।तो "); 'अन्यथा' एलडी_LIBRARY_PATH' या इसके बिल्टिन समकक्ष का उपयोग किया जाता है। –

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

  • कोई संबंधित समस्या नहीं^_^