JNA回调函数中的处理va_list参数

问题描述 投票:2回答:2

从本地库接收到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,而argscom.sun.jna.Pointer更合适。

我如何从此va_list中获取数据?

N.B。为了获得对String[]的访问权限,我添加了一些Java代码:

org.gphoto2.jna.GPhoto2Native]的添加:]

Object[]

已创建org.gphoto2.jna.LogFunc

gp_log_add_func

org.gphoto2.jna.LogFunc]的实现和用法:]

int gp_log_add_func(int logLevel, LogFunc func, Pointer data);

从本地库接收到va_list参数后,如何用Java处理它?我正在使用一个C库,该库有助于通过回调函数进行记录。该库是libghoto2,我...

java callback jna variadic-functions libgphoto2
2个回答
2
投票

这里是一个示例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);
}

0
投票

也许这里与作者无关,但对于像我一样遇到此问题的任何新手,这可能都是有用的。这些问题大多数与日志回调有关,在这种情况下,仅使用C和另一个JNA调用可能对我们有利。

© www.soinside.com 2019 - 2024. All rights reserved.