Преобразование несовместимых типов с использованием SWIG - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть библиотека C ++, которую я пытаюсь использовать под Java. Чтобы имитировать это хорошо, я пытаюсь использовать typedefs в интерфейсе .i файл SWIG. Мне трудно преобразовать универсальные типы в Java. Пока у меня есть такой код в файле интерфейса .i:

%module api
%{
    #include "api.h"

    typedef unsigned __int64 Tint64u;
    typedef Tint64u TContext_t;
%}
%include "api.h"

%apply unsigned long long { unsigned __int64 };

typedef unsigned __int64 Tint64u;
typedef Tint64u TContext_t;

и под моим классом C ++ у меня есть такой класс, где один из методов принимает TContext_t в качестве входного аргумента:

class APIClass {

public:
    APIClass();
    void test(TContext_t context);

};

Я скомпилировал его с SWIG и под Java я пытаюсь использовать этот метод так:

class main {
    public static void main(String[] args) {
        System.loadLibrary("api");
        APIClass api = new APIClass();
        api.test((SWIGTYPE_p_unsigned___int64) BigInteger.valueOf(0));
    }
}

Но здесь я получаю сообщение об ошибке BigInteger cannot be converted to SWIGTYPE_p_unsigned___int64. Чего мне не хватает в моем файле интерфейса, чтобы я мог начать передавать числовые значения в мой метод test()? Я хотел бы инициализировать его с 0 для начала, позже он будет заполнен в программе.

1 Ответ

0 голосов
/ 19 ноября 2018

У вас здесь все в неправильном порядке. Когда SWIG видит ваш заголовочный файл через директиву %include, он не имеет представления о том, что на самом деле является TContext_t. Это потому, что он обрабатывает каждую вещь построчно. Таким образом, в итоге получается что-то придумывать, что почти всегда не то, что вы хотите. Вы можете заметить это здесь, потому что имя типа в генерируемом методе начинается с SWIGTYPE_.

Исправление должно быть простым, хотя. Если вы измените порядок вашего .i файла следующим образом:

%module api
%{
    #include "api.h"

    typedef unsigned __int64 Tint64u;
    typedef Tint64u TContext_t;
%}
%apply unsigned long long { unsigned __int64 };

typedef unsigned __int64 Tint64u;
typedef Tint64u TContext_t;

%include "api.h"

Тогда это должно просто сработать, при условии, что вы также удалите неправильный приведение из вашего вызова в примере Java.

...