FFI बेसिक्स: फंक्शन्स लोड करना और आयात करना
आप FFI के साथ काम कर सकते हैं इसके फंक्शन्स को एक मॉड्यूल में शामिल करके जिसे आप बनाते हैं।
इस तरह:
require 'ffi' module A extend FFI::Library end
फिर, मॉड्यूल के अंदर, हम ffi_lib मेथड का उपयोग करके एक लाइब्रेरी लोड करने जा रहे हैं।
एक C लाइब्रेरी, जैसे विंडोज में "DLL", या लिनक्स में "SO", "सिम्बल्स" की एक सूची निर्यात करता है, या फंक्शन परिभाषाएं जो एक प्रोग्राम दूसरों के उपयोग के लिए उपलब्ध कराता है।
आइए "libc" की आवश्यकता करते हैं, C की स्टैंडर्ड लाइब्रेरी।
यहाँ कैसे:
module A extend FFI::Library ffi_lib 'c' end
अब:
आप attach_function मेथड के साथ इस लाइब्रेरी से विशिष्ट फंक्शन्स को Ruby मेथड्स के रूप में आयात कर सकते हैं।
यहाँ एक उदाहरण है:
module A
extend FFI::Library
ffi_lib 'c'
attach_function :strlen, [:string], :int
end
A.strlen("abc") # 3
यह कैसे काम करता है?
सबसे पहले, हम जानते हैं कि C में strlen नामक एक फंक्शन है, यह फंक्शन chars * को आर्गुमेंट के रूप में लेता है।
chars * Ruby में String में अनुवादित होता है।
फिर...
यह strlen फंक्शन एक मान लौटाता है, जो स्ट्रिंग की लंबाई है।
दूसरे शब्दों में, attach_function 3 पैरामीटर्स लेता है:
- C फंक्शन का नाम
- आर्गुमेंट टाइप्स की एक सरणी
- एक रिटर्न टाइप
आपको यह पता लगाने के लिए डॉक्यूमेंटेशन पढ़ना होगा कि एक विशेष फंक्शन किन टाइप्स के साथ काम करता है।
एक और उदाहरण के लिए समय!
अपना खुद का मीडिया प्लेयर बनाएं
आप खेलने के लिए कई दिलचस्प लाइब्रेरी ढूंढ सकते हैं।
लिनक्स में, अधिकांश /usr/lib/ डायरेक्टरी के तहत पाए जाते हैं, उनके नाम में "lib" से शुरू होकर और "so" एक्सटेंशन के साथ समाप्त होते हैं।
उन्हें इस तरह सूचीबद्ध करें:
ls /usr/lib/lib*.so
इस उदाहरण के लिए, हम VLC के मीडिया प्लेयर लाइब्रेरी का उपयोग करने जा रहे हैं:
/usr/lib/libvlc.so
हमारा लक्ष्य एक mp3 फाइल लोड करना और इसे चलाना है!
आइए इससे शुरू करें:
require 'ffi' module VLC extend FFI::Library ffi_lib 'vlc' attach_function :libvlc_get_version, [], :string end
यह आपको लाइब्रेरी सही ढंग से लोड हो रही है या नहीं टेस्ट करने और फिर उसका वर्जन प्रिंट करने की अनुमति देता है।
इस तरह:
VLC.libvlc_get_version # "3.0.6 Vetinari"
आप एक चौथा पैरामीटर जोड़कर इन मेथड्स को एक कस्टम नाम दे सकते हैं।
उदाहरण:
attach_function :get_version, :libvlc_get_version, [], :string
फिर आप ऐसा कर सकते हैं:
VLC.get_version
अब mp3 चलाने के लिए हमें क्या चाहिए?
यदि हम डॉक्यूमेंटेशन को देखते हैं, तो libvlc_media_player_play फंक्शन जाने का रास्ता लगता है।
इस फंक्शन को एक मीडिया प्लेयर "ऑब्जेक्ट" की आवश्यकता होती है।
एक मीडिया प्लेयर को एक मीडिया की आवश्यकता होती है, और एक मीडिया को एक VLC इंस्टेंस की आवश्यकता होती है।
यहाँ प्रक्रिया है:
VLC इंस्टेंस -> मीडिया -> मीडिया_प्लेयर -> प्ले
मैंने libVLC के लिए डॉक्यूमेंटेशन पढ़कर इसे एक साथ जोड़ा।
Ruby में मेमोरी पॉइंटर्स???
C में आपको कोई ऑब्जेक्ट्स नहीं मिलेंगे, सब कुछ मेमोरी पॉइंटर्स के साथ संभाला जाता है।
एक मेमोरी पॉइंटर डेटा के साथ एक मेमोरी एड्रेस है।
आइए एक कोड उदाहरण देखें:
module VLC extend FFI::Library ffi_lib 'vlc' attach_function :get_version, :libvlc_get_version, [], :string attach_function :new, :libvlc_new, [:int, :int], :pointer end VLC.new(0, 0) # FFI::Pointer address=0x000055c6f04ae7b0
VLC.new को कॉल करने के परिणामस्वरूप हमें एक पॉइंटर मिलता है।
हमें इसे अन्य C फंक्शन्स को पास करना होगा जिन्हें इसकी आवश्यकता है।
अब:
पूरा उदाहरण और इसका उपयोग कैसे करें।
module VLC extend FFI::Library ffi_lib 'vlc' attach_function :version, :libvlc_get_version, [], :string attach_function :new, :libvlc_new, [:int, :int], :pointer attach_function :libvlc_media_new_path, [:pointer, :string], :pointer attach_function :libvlc_media_player_new_from_media, [:pointer], :pointer attach_function :play, :libvlc_media_player_play, [:pointer], :int attach_function :stop, :libvlc_media_player_stop, [:pointer], :int attach_function :pause, :libvlc_media_player_pause, [:pointer], :int end
यह कुछ संगीत चलाने के लिए पर्याप्त है:
vlc = VLC.new(0, 0) media = VLC.libvlc_media_new_path(vlc, "/home/jesus/Downloads/meditation.mp3") player = VLC.libvlc_media_player_new_from_media(media) VLC.play(player)
यह बिना किसी विजुअल इंटरफेस के संगीत चलाएगा।
आप इसके ऊपर अपना खुद का वेब इंटरफेस बना सकते हैं।
इसे आज़माएं!
सारांश
आपने FFI की अद्भुत शक्ति के बारे में सीखा! एक Ruby मॉड्यूल जो आपको एक्सटर्नल लाइब्रेरीज का उपयोग करने की अनुमति देता है जैसे कि वे भाषा का हिस्सा हों।
कृपया इस आर्टिकल को शेयर करें ताकि अधिक लोग इसका आनंद ले सकें 🙂
पढ़ने के लिए धन्यवाद!