Java 如何使用JNI将图像作为结构参数传递给libfprint的C函数

Java 如何使用JNI将图像作为结构参数传递给libfprint的C函数,java,c,pointers,java-native-interface,bufferedimage,Java,C,Pointers,Java Native Interface,Bufferedimage,我正在使用生物识别指纹扫描设备,我已经开发了一个Java应用程序来获取指纹图像数据。现在我想处理这张图像并进行指纹匹配。为此,我找到了一个开源库 该库提供了一些处理图像的函数以及匹配这些图像的函数。当应用程序用Java编写时,图像从Java代码传递到C代码。例如,现在库中用于图像二值化的函数如下所示 struct fp_img *fp_img_binarize(struct fp_img *img) 在以结构数据为参数的C代码中,我应该从Java代码向这些函数传递什么?或者,如果C函数采用结构

我正在使用生物识别指纹扫描设备,我已经开发了一个Java应用程序来获取指纹图像数据。现在我想处理这张图像并进行指纹匹配。为此,我找到了一个开源库

该库提供了一些处理图像的函数以及匹配这些图像的函数。当应用程序用Java编写时,图像从Java代码传递到C代码。例如,现在库中用于图像二值化的函数如下所示

struct fp_img *fp_img_binarize(struct fp_img *img)

在以结构数据为参数的C代码中,我应该从Java代码向这些函数传递什么?或者,如果C函数采用结构作为参数,那么如何将Java代码中的值传递给C函数?或者在这种情况下如何编写JNI层?

您必须编写一个JNI函数,该函数将从Java获取图像并将其转换为libfprint的fp_img结构(您不能只从Java调用任何C库函数)

libfprint中的结构如下所示

struct fp_img {
    int width;
    int height;
    size_t length;
    uint16_t flags;
    struct fp_minutiae *minutiae;
    unsigned char *binarized;
    unsigned char data[0];
};
libfprint并不真正用于外部图像。通常,首先应该使用libfprint获取指纹图像

但是您可以通过调用函数来创建新图像

struct fp_img *fpi_img_new(size_t length)
长度=宽度*高度。问题是,这个函数可能没有在libfprint头中声明,因此您必须自己声明它,或者只是重新实现它。它只是这样做:

struct fp_img *img = malloc(sizeof(struct fp_img) + length);
img->length = length;
然后您可能还应该设置

img->width = width;
img->height = height;
然后,您可以使用此函数访问原始图像数据(8位灰度)(我假设行-列顺序,即数据[x+y*img->width]将是(x,y)像素)

可以将此数组视为大小=长度。然后,您可以简单地将Java图像的像素写入JNI函数中的这个数组。
当您最终拥有图像时,您可以将其传递给fp_img_二进制函数。

您可以将结构地址作为无符号长值传递给C函数吗?感谢您的重播。我不知道如何传递它,请您简单解释一下如何将无符号长值传递给C函数?。一旦我使用OpenCV。java库提供了一个函数来获取类Mat.:)的地址。对不起,没有有用的信息。嘿,我正在使用Jlibfprint包装libfprint。Jlibfprint_jni中有一个ReadMEFile,它有一行:指定刚刚修补的libfprint的源文件的JDK路径。我无法设置此路径。我必须走哪条路。是img.c路径吗?你能帮我吗?
unsigned char *fp_img_get_data(struct fp_img *img)