Я пытаюсь добавить некоторые нативные методы в класс модуля 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 для генерации подписи этой функции?