0

我需要通过回调调用使用 JNA 的方法,问题是 api 无法识别该方法,因为 JNA 回调不包含通过方法参数传递的函数。

C中的函数是:

Result API LS800AutoDocHandle(...
int          (__stdcall *userfunc1)(S_CODELINE_INFO_LS800 *CodelineInfo),
int          (__stdcall *userfunc2)(S_IMAGE_INFO_LS800 *ImageInfo),
int          (__stdcall *userfunc3)(S_IMAGE_INFO_LS800 *ImageInfo),
...);

这个函数调用这个方法

    Reply = LS800AutoDocHandle(...
    (CodelineType == READ_CODELINE_MICR ? OnCodelineRead : 0),
    (CodelineType == NO_READ_CODELINE ? OnImageFrontReady : 0),
    NULL,//OnImageBackReady,
    ...);                  // Reserved3    

那么我的问题是,如何通过 JNA 的回调调用 OnCodelineRead 方法?

4

1 回答 1

1

JNA 使用Callback对象来表示函数指针,并包含对回调用法的描述

本机代码:

int LS800AutoDocHandle(
                       int (__stdcall *userfunc1)(S_CODELINE_INFO_LS800* info),
                       int (__stdcall *userfunc2)(S_CODELINE_INFO_LS800* info),
                       int (__stdcall *userfunc3)(S_CODELINE_INFO_LS800* info)
                      );

JNA 映射(应该可能使用StdCallLibraryAPI可能是__stdcall):

public interface CodeLineRead extends StdCallCallback {
    int invoke(S_IMAGE_INFO_LS800 info);
}
public interface ImageFrontReady extends StdCallCallback {
    int invoke(S_IMAGE_INFO_LS800 info);
}
public interface ImageBackReady extends StdCallCallback {
    int invoke(S_IMAGE_INFO_LS800 info);
}

int LS800AutoDocHandle(CodeLineRead f1, ImageFrontReady f2, ImageBackReady f3);
于 2013-09-13T16:01:12.610 回答