如何附加使用ruby ffi返回字符串的C函数?

时间:2014-07-03 07:38:36

标签: c ruby ffi ruby-ffi

我目前正在研究C字符串度量库,并且正在为ruby编写绑定。使用ffi如何使用char *function(const char *, const char *)等签名附加功能?有问题的函数将使用malloc在堆上分配一个字符串,然后返回指向该字符串的指针。

我相信我需要在一个ruby方法中包装ffi附加函数,以便我可以将返回的字符串指针转换为ruby字符串并释放旧指针。

1 个答案:

答案 0 :(得分:0)

经过一些工作并在irb中搞乱后,我想出了如何安全地包装一个返回char *的C函数。首先,有必要包装libc' free函数。

module LibC
    extend FFI::Library

    ffi_lib FFI::Library::LIBC

    # attatch free
    attach_function :free, [:pointer], :void
end

现在我们可以访问free,我们可以附加该函数并将其包装在ruby模块函数中。我还包括一个帮助方法来检查有效的字符串参数。

module MyModule
    class << self
        extend FFI::Library

        # use ffi_lib to include the library you are binding

        def function(str)
            is_string(str)
            ptr = ffi_function(str)
            result = String.new(ptr.read_string)
            LibC.free(ptr)

            result
        end

        private

        # attach function and alias it as ffi_function
        attach_function :ffi_function, :function, [:string], :pointer

        # helper to verify strings
        def is_string(object)
            unless object.kind_of? String
                raise TypeError,
                    "Wrong argument type #{object.class} (expected String)"
            end
        end
    end
end

这就是它,希望它可以帮助其他有类似问题的人。