如何处理ruby ffi gem中的ruby数组?

我想使用ruby ffi gem来调用ac函数,它有一个数组作为输入变量,输出是一个数组。 也就是说,c函数看起来像:

double *my_function(double array[], int size) 

我创建了ruby绑定:

 module MyModule extend FFI::Library ffi_lib 'c' ffi_lib 'my_c_lib' attach_function :my_function, [:pointer, int], :pointer 

我想用ruby代码打电话,如:

 result_array = MyModule.my_function([4, 6, 4], 3) 

我该怎么做?

假设这是您希望在ruby脚本中使用的库,将其my_c_lib.c

 #include  double *my_function(double array[], int size) { int i = 0; double *new_array = malloc(sizeof(double) * size); for (i = 0; i < size; i++) { new_array[i] = array[i] * 2; } return new_array; } 

您可以像这样编译它:

 $ gcc -Wall -c my_c_lib.c -o my_c_lib.o $ gcc -shared -o my_c_lib.so my_c_lib.o 

现在,它已准备好在你的ruby代码中使用( my_c_lib.rb ):

 require 'ffi' module MyModule extend FFI::Library # Assuming the library files are in the same directory as this script ffi_lib "./my_c_lib.so" attach_function :my_function, [:pointer, :int], :pointer end array = [4, 6, 4] size = array.size offset = 0 # Create the pointer to the array pointer = FFI::MemoryPointer.new :double, size # Fill the memory location with your data pointer.put_array_of_double offset, array # Call the function ... it returns an FFI::Pointer result_pointer = MyModule.my_function(pointer, size) # Get the array and put it in `result_array` for use result_array = result_pointer.read_array_of_double(size) # Print it out! p result_array 

这是运行脚本的结果:

 $ ruby my_c_lib.rb [8.0, 12.0, 8.0] 

关于内存管理的说明......来自文档https://github.com/ffi/ffi/wiki/Pointers :

FFI :: MemoryPointer类将自动垃圾收集的本机内存分配为甜味剂。 当MemoryPointer超出范围时,内存将作为垃圾收集过程的一部分释放。

所以你不应该直接调用pointer.free 。 另外,为了检查是否必须手动释放result_pointer ,我在打印解压缩数组后调用了result_pointer.free并获得了此警告

 warning: calling free on non allocated pointer # 

所以看起来你不必手动释放result_pointer