Foo.h that I want to swig:
#include <cstdint>
class Result
{
public:
Result(const uint8_t *resultBuffer, int width, int height);
const uint8_t *result;
int width = -1;
int height = -1;
};
class Foo
{
public:
Result doThing();
private:
Context ctx;
};
Under the hood, Foo.doThing() does this:
// Context.buffer, a uint8_t*, points at allocated memory.
// that memory gets automatically freed when the Foo instance goes away.
//
// some stuff is written to ctx.buffer.
// int variables "bufferWidth" and "bufferHeight" are updated.
// multiplying them together gives size of ctx.buffer.
//
// finally:
Result result(ctx.buffer, ctx.bufferWidth, ctx.bufferHeight);
return result;
I want the result buffer to be a ByteBuffer on the Java side. After some googling I came up with this swig interface file:
%module FooSwigModule
%include "stdint.i"
// FIXME: likely wrong
%include "various.i"
%apply unsigned char *NIOBUFFER { uint8_t *resultBuffer };
%{
/* Includes the header in the wrapper code */
#include "Foo.h"
%}
/* Parse the header file to generate wrappers */
%include "Foo.h"
Java side:
{
Foo foo = new Foo();
Result result = foo.doThing();
int width = result.get_width(); // OK
int height = result.get_width(); // OK
ByteBuffer byteBuffer = result.get_result(); // SIGSEGV here
// do things with result.get_result(), width, and height
// ...
}
What should replace the two lines below FIXME in the swig interface file?