JNA指针指向映射

时间:2016-10-28 12:05:51

标签: jna vips

我正在为优秀的libvips

开发Java绑定

使用此功能一切都很好:

VipsImage *in;

in = vips_image_new_from_file( test.jpg, NULL )
vips_image_write_to_file( in, "out.jpg", NULL )

在Java中映射:

Pointer vips_image_new_from_file(String filename,String params);

但是当我这样的参数出现问题时:

VipsImage *in;
VipsImage *out;

vips_invert( in, &out, NULL )
vips_image_write_to_file( out, "out.jpg", NULL ) 

我试过了:

int vips_resize(Pointer in, PointerByReference out, Double scale, String params);

Pointer in = vips_image_new_from_file("file.png",null);

PointerByReference ptr1 = new PointerByReference();

vips_invert(in, ptr1, null);
vips_image_write_to_file( ptr1.getValue(), "fileout.png", null);

但是没有用。 ptr1.getValue()不包含预期结果。

我该怎么做?

由于

1 个答案:

答案 0 :(得分:0)

我是libvips维护者,Java绑定会很棒!

但我认为你可能采取了错误的做法。我认为你正在尝试直接包装C API,但这样做会很棘手,因为它使用了许多不能很好地映射到Java的C-isms。例如,在C中你可以写:

VipsImage *image;

if (!(image = vips_image_new_from_file("somefile.jpg",
    "shrink", 2,
    "autorotate", TRUE,
    NULL)))
    error ...;

即。最后的NULL标记了varargs名称/值列表的结尾。在这里,我要求jpeg加载程序在加载期间执行x2收缩,并应用它在EXIF中找到的任何Orientation标记。

libvips有一个基于GObject的低级API,它更容易绑定。在这个问题上有一些讨论和示例代码,其中有人使用p / invoke进行C#绑定。

https://github.com/jcupitt/libvips/issues/558

C ++和PHP绑定的代码可能是一个有用的参考:

https://github.com/jcupitt/libvips/tree/master/cplusplus

https://github.com/jcupitt/php-vips-ext

这是1800行C语言中整个库的PHP绑定。

如果可以,我会很乐意提供帮助。在libvips跟踪器上打开一个问题:

https://github.com/jcupitt/libvips/issues