我正在尝试使用%native
指令向SWIG生成的Java模块类中添加一些本机方法。
这些是他们在C语言中的签名:
JNIEXPORT jobject JNICALL Java_org_foo_bar_ModulClassJNI_createBuffer(JNIEnv* env, jobject clazz, jlong size);
JNIEXPORT void JNICALL Java_org_foo_bar_ModuleClassJNI_deleteBuffer(JNIEnv* env, jobject clazz, jobject buf);
第一个取一个long
并返回一个java.nio.ByteBuffer
,第二个取一个java.nio.ByteBuffer
,并且不返回任何内容。
我能够使用某些createBuffer
指令使SWIG将Object
的返回类型从默认的java.nio.ByteBuffer
更改为%typemap
:
%typemap(jstype) ByteBuffer createBuffer "java.nio.ByteBuffer"
%typemap(jtype) ByteBuffer createBuffer "java.nio.ByteBuffer"
%typemap(javaout) ByteBuffer createBuffer { return $jnicall; }
%native(createBuffer) ByteBuffer createBuffer(jlong size);
// ** what %typemaps do I need here? the ones above don't seem to work on parameters **
%native(deleteBuffer) void deleteBuffer(jobject buf);
但是我也想以相同的方式更改buf
的{{1}}参数的类型。
到目前为止,生成的Java代码如下:
deleteBuffer
我想要的是这样的东西:
// this is good:
public static java.nio.ByteBuffer createBuffer(long size) { return ModuleClassJNI.createBuffer(size); }
// without typemaps, less than ideal:
public static void deleteBuffer(Object buf) {
ModuleClassJNI.deleteBuffer(buf);
}
// this is what I get when I change deleteBuffer(jobject buf); to
// deleteBuffer(ByteBuffer buf); in the %native directive, but this is worse:
public static void deleteBuffer(SWIGTYPE_p_ByteBuffer buf) {
ModuleClassJNI.deleteBuffer(SWIGTYPE_p_ByteBuffer.getCPtr(buf));
}
我唯一要更改的是 public static void deleteBuffer(java.nio.ByteBuffer buf) {
ModuleClassJNI.deleteBuffer(buf);
}
的单个参数的类型。
如何获取SWIG来生成此功能签名?