0

我正在尝试使用 FFI 实现Darknet 库中的一些功能:

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 很陌生,但我已经成功地实现了其他功能,没有任何问题。如果有人可以给我指点(不是双关语),我一定会遗漏一些明显的东西......

4

1 回答 1

0

Ruby 字符串与 C char *(或char [])不同,后者是一个以空字符结尾(最后一个字符是 ASCII 0 - '\0')的连续字符数组,通常被认为是 c 中的“字符串”。

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

于 2018-06-18T23:33:37.883 回答