使用 FFI 从 Ruby 访问 Cocoa?

发布于 2024-12-28 16:51:52 字数 179 浏览 0 评论 0原文

是否可以使用 Ruby 中的 Cocoa API 通过 FFI 加载库?我知道您可以使用 RubyCocoa 或 MacRuby 访问这些库,但如果可能的话,我宁愿坚持使用“普通”ruby。我读到 RubyCocoa 使用 libffi(如果我没记错的话,FFI 依赖它)来利用库,所以也许可以对 FFI 做同样的事情。

谢谢!

Is it possible to use the Cocoa API from Ruby loading the libraries with FFI? I know that you can access those libraries with RubyCocoa or MacRuby, but I would rather stick to "normal" ruby if possible. I have read that RubyCocoa uses libffi (on which if I'm not mistaken FFI relies) to tap into the libraries, so maybe it is possible to do the same with FFI.

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

像极了他 2025-01-04 16:51:52

是的,但不是一种非常有用的方式。

这是一个功能齐全的示例:

require 'ffi'

module ObjC
  extend FFI::Library

  ffi_lib 'objc'

  attach_function :sel_registerName, [:string], :pointer
  attach_function :objc_msgSend, [:pointer, :pointer, :varargs], :pointer
  def self.msgSend( id, selector, *args )
    selector = sel_registerName(selector) if selector.is_a? String
    return objc_msgSend( id, selector, *args )
  end
  attach_function :objc_getClass, [:string], :pointer
end

module Cocoa
  extend FFI::Library

  ffi_lib '/System/Library/Frameworks/Cocoa.framework/Cocoa'

  attach_function :NSApplicationLoad, [], :bool
  NSApplicationLoad()
 end

pool = ObjC.msgSend(ObjC.msgSend(ObjC.objc_getClass("NSAutoreleasePool"),"alloc"),"init")
application = ObjC.msgSend(ObjC.objc_getClass("NSApplication"),"sharedApplication")
ObjC.msgSend(application,"run")

Yes it is, but not in a very useful fashion.

Here is a fully functional example:

require 'ffi'

module ObjC
  extend FFI::Library

  ffi_lib 'objc'

  attach_function :sel_registerName, [:string], :pointer
  attach_function :objc_msgSend, [:pointer, :pointer, :varargs], :pointer
  def self.msgSend( id, selector, *args )
    selector = sel_registerName(selector) if selector.is_a? String
    return objc_msgSend( id, selector, *args )
  end
  attach_function :objc_getClass, [:string], :pointer
end

module Cocoa
  extend FFI::Library

  ffi_lib '/System/Library/Frameworks/Cocoa.framework/Cocoa'

  attach_function :NSApplicationLoad, [], :bool
  NSApplicationLoad()
 end

pool = ObjC.msgSend(ObjC.msgSend(ObjC.objc_getClass("NSAutoreleasePool"),"alloc"),"init")
application = ObjC.msgSend(ObjC.objc_getClass("NSApplication"),"sharedApplication")
ObjC.msgSend(application,"run")
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文