Используйте SWIG для генерации прокси-класса для структуры C и класса-оболочки для указателя на структуру C - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь заставить 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 действительно полезен.для ?

...