Ruby / FFI:字符串没有到达* char函数参数

时间:2018-06-18 20:50:26

标签: c ruby ffi ruby-ffi

我试图用FFI实现Darknet library中的一些功能:

require 'ffi'

class Image < FFI::Struct
  layout :w, :int
  layout :h, :int
  layout :c, :int
  layout :data, :pointer
end

class Darknet
  extend FFI::Library

  ffi_lib "./libdarknet.so"

  attach_function :load_image_color, [:string, :int, :int], Image

end

image = Darknet.load_image_color("./test.jpg", 0, 0)

似乎文件名字符串没有通过:

Cannot load image "(null)"
STB Reason: can't fopen

以下是the functionthe declaration

我对FFI很陌生,但我设法实现其他功能而没有任何问题。如果有人可以给我指点(没有任何双关语),我一定会错过一些明显的东西......

1 个答案:

答案 0 :(得分:0)

Ruby字符串与C char [](或'\0')不同,后者是以null结尾的(最后一个字符是ASCII 0 - StringValueCStr(str))连续数组字符,通常被认为是&#34;字符串&#34;在c。

因此,您需要通过宏str将ruby字符串转换为指针(其中"./test.jpg"是字符串变量StringValuePtr(str))。还有StringValueCStr()的选项,这在性能方面更好,但它并非完全安全,因为它没有考虑到c字符串为空终止的事实,因此不能在字符串中使用null终止符(Ruby字符串允许)。另一方面,'mail_admins'会考虑到这一点,因此可确保您拥有有效的c字符串。