Я пытаюсь заставить SWIG сгенерировать Java-код, чтобы я мог обернуть библиотеку Си.
У меня есть файл заголовка C, который выглядит (примерно) так:
struct MyDatabase;
typedef struct MyDatabase MyDatabase;
struct MyDatabase {
const void *db;
};
struct MyDatabase *open_database(char *name);
Я написал свой файл интерфейса SWIG следующим образом:
%module database
%{
#include "database.h"
%}
struct MyDatabase;
%nodefaultctor MyDatabase;
%nodefaultdtor MyDatabase;
struct MyDatabase {
const void *db;
};
struct MyDatabase *open_database(char *name);
%include "cpointer.i"
%pointer_functions(MyDatabase, MyDatabasePtr)
IЗатем я выполняю:
swig -java -package com.test.db -outdir com/test/db -o database.c database.i
То, что я хочу сделать в своем коде Java, выглядит примерно так:
SWIGTYPE_p_MyDatabase dbPointer = open_database("some_db_name");
MyDatabase db = MyDatabasePtr_value(dbPointer);
Или что-то в этом роде.По сути, я хочу иметь возможность вызывать библиотеку C open_database
, которая вернет указатель на MyDatabase
, а затем сможет получить доступ к базовому экземпляру MyDatabase
, чтобы получить доступ к его свойствам и т. Д.
Проблема, с которой я сталкиваюсь, заключается в том, что я не могу заставить SWIG генерировать прокси-класс для MyDatabase
, а также генерировать класс-оболочку для указателя на MyDatabase
(то есть SWIGTYPE_p_MyDatabase
).
Я могу прийти к этому совершенно неправильному пути, но из того, что я прочитал до сих пор, кажется, что интерфейсный файл выше должен позволить мне сделать это, но это не так, очевидно, я пропускаючто-то!
ОБНОВЛЕНИЕ 1:
Если я добавлю %include "database.h"
к database.i
, я получу сгенерированные MyDatabase
и SWIGTYPE_p_MyDatabase
.Однако функция указателя, которую я надеялся сгенерировать с помощью %pointer_functions(MyDatabase, MyDatabasePtr)
, в итоге выдает:
public static SWIGTYPE_p_MyDatabase MyDatabaseHandle_value(SWIGTYPE_p_MyDatabase obj) {
return new SWIGTYPE_p_MyDatabase(databaseJNI.MyDatabaseHandle_value(SWIGTYPE_p_MyDatabase.getCPtr(obj)), true);
}
, что, насколько я могу судить, не очень полезно.Я ожидал, что эта функция будет:
public static MyDatabase MyDatabaseHandle_value(SWIGTYPE_p_MyDatabase obj) {
return new MyDatabase(databaseJNI.MyDatabaseHandle_value(SWIGTYPE_p_MyDatabase.getCPtr(obj)), true);
}
Ручное изменение функции на предыдущую, похоже, работает, но на самом деле это не долгосрочное решение, и не в духе того, что SWIG действительно полезен.для ?