2011-03-29 6 views
4

SWIG를 사용하여 C++ 클래스를 Java로 내보내지만 프록시 객체가 인터페이스를 구현하도록하는 데 문제가 있음 .SWIG/Java 강제로 프록시 클래스에서 인터페이스를 구현하는 방법을 알아낼 수 없습니다.

SWIG 설명서를 훑어보고 "% pragma (java) jniclassinterfaces = x"를 사용하여 JNI 클래스가 주어진 인터페이스를 구현하도록하고 "% pragma (java) moduleinterfaces = x"를 사용하여 모듈을 가질 수 있음을 발견했습니다. 지정된 인터페이스는 구현하지만 실제 프록시 객체에는 해당하는 프라그 마가 없습니다.

SWIG가 '구현 X'코드를 생성하는 것을 선호합니다. 나중에이 구현을 추가하려고 시도하는 것이 어렵다는 것을 증명합니다.

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

그래서 이런 일이 실패 :

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

때문에 나는 꿀꺽 꿀꺽 프록시를 서브 클래스 다음 인터페이스를 구현하려고하면 나는 또한 제네릭을 사용하고 있기 때문에 예를 들어, 내가 문제로 실행 부모 클래스를 자식 클래스에 캐스팅해야합니다.

이 문제를 해결할 수있는 다른 방법은 래퍼 클래스를 만들거나 복사본 생성자를 사용하는 것입니다. 두 가지 모두 하나의 인터페이스를 구현하려는 전체 목적에 비해 다소 비효율적 인 것처럼 보입니다.

답변

6

typemaps mechanism을 통해 처리해야합니다. 다음 코드 :

%module test 

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

struct Foo { 
}; 

지금처럼 Foo의 기지와 인터페이스를 설정 : 생성 된 Java 프록시 클래스의

public class Foo extends SomeBase implements SomeInterface { 

//... 

.

관련 문제