ネイティブ ライブラリから受け取った va_list 引数を Java で処理するにはどうすればよいですか?
コールバック関数によるロギングを容易にする C ライブラリを使用しています。ライブラリはlibgoto2で、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
or のString[]
方Object[]
が適しているものにすることです。
この 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);