не могу понять, как заставить SWIG / Java заставить прокси-класс реализовать интерфейс - PullRequest
4 голосов
/ 29 марта 2011

Я использую SWIG для экспорта класса c ++ в Java, но столкнулся с проблемой, пытаясь заставить прокси-объект реализовать интерфейс.

Я изучил документацию SWIG и обнаружил, что вы можете использовать "% pragma (java) jniclassinterfaces = x", чтобы класс JNI реализовал данный интерфейс, и использовать "% pragma (java) moduleinterfaces = x", чтобымодуль реализует любой данный интерфейс, но не имеет соответствующей прагмы для фактического прокси-объекта.

Я бы предпочел, чтобы SWIG генерировал код «реализует X», поскольку попытка добавить эту реализацию позже оказывается трудной.Например, если я пытаюсь создать подкласс SWIG-прокси и затем реализовать интерфейс, я сталкиваюсь с проблемами, потому что я также использую дженерики:

interface IVector<VectorType> {
   VectorType add(VectorType other);
   ...
}

Так что-то подобное терпит неудачу:

class MyVector extends MyProxyVector implements IVector<MyVector> {
    MyVector add(MyVector other) {
        return (MyVector) super.add(other);
    }
}

, потому что это потребует приведения родителя к дочернему классу.

Единственный другой способ обойти эту проблему - это создать класс-обертку или использовать конструктор копирования.Оба они кажутся неэффективными, поскольку их цель - реализовать один интерфейс.

1 Ответ

6 голосов
/ 20 ноября 2011

Это должно быть обработано с помощью механизма typemaps . Следующий код:

%module test

%typemap(javainterfaces) Foo "SomeInterface"
%typemap(javabase) Foo "SomeBase"

struct Foo {
};

Устанавливает базы и интерфейсы для Foo, например:

public class Foo extends SomeBase implements SomeInterface {

//...

в сгенерированном прокси-классе Java.

...