使用 SBCL,我尝试使用此签名调用 GStreamer 函数:
void gst_init (int *argc, char **argv[]);
所以我根据我所看到的here:
编写了这个界面代码(简化)(cffi:defcfun gst-init :VOID
(argc :POINTER :INT)
(argv :POINTER :STRING))
(defun start-gstreamer ()
(cffi:with-foreign-object (argc :INT)
(setf (cffi:mem-ref argc :INT) 1)
(cffi:with-foreign-string (options "foo ")
(cffi:with-foreign-object (poptions :POINTER)
(setf (cffi:mem-ref poptions :POINTER) options)
(gst-init argc poptions)))))
但是当我运行它时,我得到一个“内存错误”,它引用了一个地址,结果是一个 ASCII 字符串“oof”,与原始字符串相反。 看来我还需要另一层间接。 或者 defcfun 可能是错误的。 我该如何实现这个目标?
在寻找在 c 函数中访问双 ** 的解决方案时,我遇到了这个查询。
我已经在我的应用程序中使用 sbcl 中的代码解决了这个问题:
;;; command-line args (max 32)
(defvar *argc* (length *posix-argv*))
(let ((args (make-alien (array c-string 32))))
(loop for n from 0 to *argc*
do (setf (deref (deref args) n)
(nth n *posix-argv*)))
(defvar *argv* (cast args (* c-string))))
这样我就可以将
*argc*
和 *argv*
传递给我的 C 函数。
不幸的是,我无法解决像这样的函数的更困难的情况(示例案例)
static double array[10];
int getArray(double **ar) {
*ar = array;
return 10;
}
代码采用双指针并用数组的地址填充它。
但是嘿,我希望我的上述解决方案对您有所帮助。