我正在尝试使用 FFI 实现暗网库中的一些函数:
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
下面是函数和声明。
我对 FFI 很陌生,但我已经设法实现了其他功能,没有任何问题。我一定错过了一些明显的东西,如果有人可以给我指点(没有双关语(......
Ruby 字符串与 Cchar *
(或char []
(不同,后者是以 null 结尾(最后一个字符是 ASCII 0 -' '
(的连续字符数组,通常被认为是 C 中的"字符串"。
因此,您需要通过宏StringValueCStr(str)
将 ruby 字符串转换为指针(其中str
是 String 变量"./test.jpg"
(。还有选项StringValuePtr(str)
,这在性能方面更好,但它并不完全安全,因为它没有考虑到 c 字符串以 null 结尾的事实,因此字符串中不能有 null 终止符(Ruby 字符串允许(。 另一方面,StringValueCStr()
确实考虑到了这一点,因此确保您拥有有效的 c 字符串。