간단한 질문에 답하고 싶습니다...
Ruby의 FFI란 무엇입니까? ?
FFI는 "외부 기능 인터페이스"를 의미합니다.
다른 프로그래밍 언어로 정의된 함수를 사용하는 방법입니다. .
Ruby의 FFI 모듈을 사용하면 다른 방법으로는 가질 수 없는 외부 라이브러리 및 코드에 액세스할 수 있습니다.
우리는 종종 이것을 C 코드로 작업하는 데 사용합니다.
예: :
- rb-inotify
- 루비 VIP
- 루비-nfc
FFI 모듈의 도움으로 FFI를 사용하는 프로그램을 직접 작성할 수 있습니다.
어떻게?
몇 가지 코드 예제를 살펴보겠습니다!
FFI 기본 사항:함수 로드 및 가져오기
생성한 모듈에 기능을 포함하여 FFI와 함께 작업할 수 있습니다.
좋아요 :
'ffi'module A 확장 FFI::Libraryend 필요
그런 다음 모듈 내부에서 ffi_lib
를 사용하여 라이브러리를 로드합니다. 방법.
Windows의 "DLL" 또는 Linux의 "SO"와 같은 C 라이브러리는 다른 사람이 사용할 수 있도록 프로그램에서 제공하는 "기호" 목록 또는 함수 정의를 내보냅니다.
C의 표준 라이브러리인 "libc"가 필요합니다.
방법은 다음과 같습니다. :
모듈 A 확장 FFI::Library ffi_lib 'c'end
지금 :
이 라이브러리의 특정 함수를 Ruby 메서드로 가져올 수 있습니다.
attach_function
사용 방법.
예시 :
모듈 A 확장 FFI::Library ffi_lib 'c' attach_function :strlen, [:string], :intendA.strlen("abc")# 3
어떻게 작동하나요?
먼저 C에 strlen
이라는 함수가 있다는 것을 알고 있습니다. , 이 함수는 chars *
를 취합니다. 주장으로.
chars *
String
로 변환 루비에서.
그럼...
이 strlen
함수는 문자열의 길이인 값을 반환합니다.
즉, attach_function
3개의 매개변수를 사용합니다:
- C 함수의 이름
- 인수 유형의 배열
- 반환 유형
특정 함수가 어떤 유형에 작동하는지 알아보려면 문서를 읽어야 합니다.
다른 예를 들어볼 시간입니다!
나만의 미디어 플레이어 만들기
재미있는 라이브러리를 많이 찾을 수 있습니다.
Linux에서 대부분은 /usr/lib/
아래에 있습니다. 이름이 "lib"로 시작하고 "so" 확장자로 끝나는 디렉토리입니다.
다음과 같이 나열 :
ls /usr/lib/lib*.so
이 예에서는 VLC의 미디어 플레이어 라이브러리를 사용할 것입니다. :
/usr/lib/libvlc.so
우리의 목표는 mp3 파일을 로드하고 재생하는 것입니다!
이것부터 시작하겠습니다 :
'ffi' 모듈 VLC 확장 FFI::Library ffi_lib 'vlc' attach_function :libvlc_get_version, [], :stringend 필요
이를 통해 라이브러리가 올바르게 로드되는지 테스트한 다음 해당 버전을 인쇄할 수 있습니다.
좋아요 :
VLC.libvlc_get_version# "3.0.6 베티나리"
네 번째 매개변수를 추가하여 이러한 메소드에 사용자 정의 이름을 지정할 수 있습니다.
예 :
attach_function :get_version, :libvlc_get_version, [], :string
할 수 있습니다 :
VLC.get_version
지금 mp3를 재생하려면 무엇이 필요합니까?
설명서를 보면 libvlc_media_player_play
기능은 갈 길이 보입니다.
이 기능에는 미디어 플레이어 "개체"가 필요합니다.
미디어 플레이어에는 미디어가 필요하고 미디어에는 VLC 인스턴스가 필요합니다.
절차는 다음과 같습니다. :
VLC 인스턴스 -> 미디어 -> 미디어 플레이어 -> 재생
libVLC
에 대한 문서를 읽어서 이것을 하나로 묶었습니다. .
루비의 메모리 포인터???
C에서는 객체를 찾을 수 없으며 모든 것이 메모리 포인터로 처리됩니다.
메모리 포인터는 데이터가 있는 메모리 주소입니다.
코드 예를 살펴보겠습니다. :
모듈 VLC 확장 FFI::라이브러리 ffi_lib 'vlc' attach_function :get_version, :libvlc_get_version, [], :string attach_function :new, :libvlc_new, [:int, :int], :pointerendVLC.new(0, 0) # FFI::포인터 주소=0x000055c6f04ae7b0
VLC.new
를 호출한 결과 포인터를 얻습니다.
이를 필요로 하는 다른 C 함수에 전달해야 합니다.
지금 :
전체 예제 및 사용 방법.
모듈 VLC 확장 FFI::라이브러리 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], :의도
음악을 재생하기에 충분합니다. :
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(플레이어)사전>시각적 인터페이스를 열지 않고 음악을 재생합니다.
이 위에 자신만의 웹 인터페이스를 구축할 수 있습니다.
시도해 보세요!
요약
FFI
의 놀라운 힘에 대해 배웠습니다. ! 외부 라이브러리를 언어 자체의 일부인 것처럼 사용할 수 있게 해주는 Ruby 모듈입니다.더 많은 분들이 볼 수 있도록 이 글을 공유해주세요 🙂
읽어주셔서 감사합니다!