从本机库接收到的 va_list 参数,如何使用 Java 处理它?
我正在使用一个有助于通过回调函数进行日志记录的 C 库。该库是libghoto2,我正在使用 JNA 包装器libgphoto2-java来访问其功能。有关应如何进行日志记录的示例,请参见此 C 文件errordumper
中的方法。
我已经设法使用库的gp_log_add_func
. 唯一的问题是,回调函数的签名包含一个va_list
我不知道如何处理的参数。
正如前面的 C 示例所示,va_list args
直接传递到vfprintf
. 阅读vfprintf
手册会很清楚,它是某种可迭代的数据结构,已经“用va_start
宏初始化”并且在迭代之后需要使用va_arg
清理va_end
。但是我发现防止 JVM 崩溃的唯一方法是使args
参数类型为com.sun.jna.Pointer
while a String[]
orObject[]
更合适。
如何从此 va_list 中获取数据?
注意为了访问gp_log_add_func,我添加了一些 Java 代码:
org.gphoto2.jna.GPhoto2Native 的补充:
int gp_log_add_func(int logLevel, LogFunc func, Pointer data);
创建org.gphoto2.jna.LogFunc:
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);
}
org.gphoto2.jna.LogFunc的实现和使用:
LogFunc callback = new LogFunc() {
public void log(int logLevel, String domain, String format, Pointer args, Pointer data) {
System.out.println("[" + domain + "] " + format);
System.out.println(args.toString());
}
};
GPhoto2Native.INSTANCE.gp_log_add_func(LogFunc.GP_LOG_ALL, callback, null);