Изменение подписи нативного метода Java, переданного через SWIG - PullRequest
0 голосов
/ 28 июня 2019

Я пытаюсь добавить некоторые нативные методы в класс модуля Java, сгенерированный SWIG, используя директиву %native.

Это их подписи в С:

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 и ничего не возвращает.

Мне удалось заставить SWIG изменить тип возвращаемого значения createBuffer по умолчанию 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 на deleteBuffer таким же образом.

Сгенерированный Java-код до сих пор выглядит следующим образом:

  // 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);
  }

Единственное, что я хочу изменить, - это тип одиночного параметра deleteBuffer.

Как мне получить SWIG для генерации подписи этой функции?

...