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

时间:2013-08-07 12:16:42

标签: java c pointers java-native-interface bufferedimage

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

此库提供了一些处理图像的功能,还提供了匹配这些图像的功能。由于应用程序是用Java编写的,因此图像从Java代码通过JNI传递到C代码。现在,例如库中图像二值化的功能如下所示

struct fp_img *fp_img_binarize(struct fp_img *img)

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

1 个答案:

答案 0 :(得分:2)

您必须编写一个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)像素)。

unsigned char *fp_img_get_data(struct fp_img *img)

您可以将此数组视为size = length。然后,您可以在JNI函数中将Java图像的像素简单地写入此数组中。 当您最终获得图像时,可以将其传递给fp_img_binarize函数。