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

标签 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 层?

最佳答案

您必须编写一个 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 header 中声明,因此您必须自己声明或重新实现它。它只是这样做:

struct fp_img *img = malloc(sizeof(struct fp_img) + length);
img->length = length;

然后你可能还应该设置

img->width = width;
img->height = height;

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

unsigned char *fp_img_get_data(struct fp_img *img)

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

关于java - 如何使用 JNI 将图像作为结构参数传递给 libfprint 的 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18103150/

相关文章:

Java 8 Streams - 为什么我不能对整数流求和?

java - 适配器中的 viewHolder.getAdapterPosition() 返回 -1 位置并导致 IndexOutOfBoundException

c - 在 C 程序中查找内存泄漏的最佳方法

c - 如何创建指向 3 维数组的 2 维的指针?

c++ - 在 C++ 中使用指针按引用传递数组

java - 对内存屏障有很好的介绍吗?

java - 在 Hibernate 中使用双向映射重复记录

c - 为什么 TaskSpawn 采用整数而不是 void*?

c - MinGW编译错误

c - 函数中动态分配内存的范围