从本地库接收到va_list参数后,如何用Java处理它?
我正在使用一个C库,该库有助于通过回调函数进行日志记录。该库为libghoto2,我正在使用JNA包装器libgphoto2-java访问其功能。有关应如何进行日志记录的示例,请参见errordumper
中的this C file方法。
我设法使用库的gp_log_add_func
添加了Java编写的回调函数。唯一的问题是,回调函数的签名包含一个gp_log_add_func
参数,我不知道该如何处理。
如va_list
所示,C example from earlier直接传递到va_list args
。读取vfprintf
会很清楚,它是某种“已经用vfprintf
manual宏初始化”的可迭代数据结构,并且在使用vfprintf
进行迭代之后,需要使用va_start
进行清理。但是,我发现防止JVM崩溃的唯一方法是使va_arg
类型的参数成为va_end
,而args
或com.sun.jna.Pointer
更合适。
我如何从此va_list中获取数据?
N.B。为了获得对String[]
的访问权限,我添加了一些Java代码:
对org.gphoto2.jna.GPhoto2Native]的添加:]
:Object[]
已创建org.gphoto2.jna.LogFunc
gp_log_add_funcorg.gphoto2.jna.LogFunc]的实现和用法:]
int gp_log_add_func(int logLevel, LogFunc func, Pointer data);
从本地库接收到va_list参数后,如何用Java处理它?我正在使用一个C库,该库有助于通过回调函数进行记录。该库是libghoto2,我...
这里是一个示例varargs实现,并带有一些有关varargs宏在做什么的提示:
public interface LogFunc extends Callback {
public static final int GP_LOG_ERROR = 0;
public static final int GP_LOG_VERBOSE = 1;
public static final int GP_LOG_DEBUG = 2;
public static final int GP_LOG_DATA = 3;
public static final int GP_LOG_ALL = GP_LOG_DATA;
//the args argument is a va_list
public void log(int logLevel, String domain, String format, Pointer args, Pointer data);
}
也许这里与作者无关,但对于像我一样遇到此问题的任何新手,这可能都是有用的。这些问题大多数与日志回调有关,在这种情况下,仅使用C和另一个JNA调用可能对我们有利。