我试图用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 function和the declaration。
我对FFI很陌生,但我设法实现其他功能而没有任何问题。如果有人可以给我指点(没有任何双关语),我一定会错过一些明显的东西......
答案 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字符串。