更改通过SWIG

时间:2019-06-28 11:51:45

标签: java java-native-interface native swig

我正在尝试使用%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来生成此功能签名?

0 个答案:

没有答案