2012-07-02 3 views
3

Java 인터페이스를 만들 때 Swig을 사용하고 있습니다. 기본적으로, C++에서 내가 템플릿이 (이 템플릿은 내가 꿀꺽 꿀꺽 통해 자바로 내 보내야 API의 일부 기능의 반환 값으로 사용됩니다SWIG 변경 기능 서명

template<class T> class TSizedArray 
{ 
    int GetLength(); 
    T* GetElements() const; 
    ... 
} 

class Producer 
{ 
    TSizedArray<long> GetLongs(); 
    ... 
} 

. 그러나, 자바에서 우리는이 대신 네이티브 자바 배열을 사용하려면 래퍼 :

Java: 
    long[] result = Producer.GetLongs(); 

나는 꿀꺽 꿀꺽와이를 달성하는 방법을 잘 모르겠습니다 템플릿은 여러 인스턴스화를 가지고 있으며, 내가 사용 할 수 있었다 입력 및 다른 클래스에서 다양한 방법의 출력으로 사용됩니다..

%typemap(jstype) TCustomElementList "long[]" 

생성 된 Java 인터페이스를 long [] GetLongs()로 가져 오지만 생성 된 구현은 TCustomElementList 유형의 새 객체를 만듭니다.

어떤 아이디어 주셔서 감사합니다.

+0

P. 코드는 실제와 다르다 - 일반적으로 최소한의, 그러나 당신이하고있는 일에 대한 완전한 예를 게시하면 질문에 대답하는 것이 더 쉽다 -이 경우에는 모든 것이 두 개의 클래스에서 비공개 였음을 발견하는 데 너무 분간한다. 쇼, 누락 된 세미콜론. – Flexo

답변

3

당신은 당신의 타입 맵과 오른쪽 라인에,하지만 당신은 그냥 그보다 약간 더 필요합니다

%module test 

template<class T> class TSizedArray 
{ 
public: 
    int GetLength(); 
    T* GetElements() const; 
}; 

%typemap(jstype) TSizedArray<long> "long[]" 
%typemap(jtype) TSizedArray<long> "long[]" 
%typemap(javaout) TSizedArray<long> { 
    return $jnicall; 
    } 

%typemap(out) TSizedArray<long> { 
    $result = JCALL1(NewLongArray, jenv, $1->GetLength()); 
    JCALL4(SetLongArrayRegion, jenv, $result, 0, $1->GetLength(), $1->GetElements()); 
} 

class Producer 
{ 
public: 
    TSizedArray<long> GetLongs(); 
}; 

(이 인터페이스는 꿀꺽 꿀꺽 벌금을 실행하지만, 더 테스트되지 않았습니다).

Proxy 클래스와 JNI 클래스 (jtype 및 jstype typemaps)의 반환 유형을 설정해야합니다. 또한 JNI 코드가 반환하는 것을 통과하도록 프록시에 지시해야합니다 (javaout typemap). 그런 다음 C++ 측 (typemap 외부)에 새로운 Java 배열을 만들기 위해 삽입되는 JNI 글루 코드를 제공해야합니다.

+0

감사합니다. 불완전한 코드에 대해 사과드립니다. 저는 Swig 파트를 만들 수 있었고, 크로스 빌드에는 잘못된 캐스트가있는 일부 문제가 있었지만 잘 해결되었습니다. 이제 각 템플릿 확장 (예 : char *)에 특정 typemap을 작성해야합니까? 원래 내 질문은 함수 출력으로 만 이것을 포함하는 것이었지만 함수 args (맵에서)에 대한 유형 맵을 만들어야했습니다. 그리고 더구나, 파이썬 인터페이스도 사용할 수 있어야합니다 ... 이것에 대한 모든 포인터? 나는 Swig와 JNI에 대해 완전히 새로운 것입니다. 감사합니다. –

+0

@ matej.ko - 대상 언어의 런타임과 직접 상호 작용하기 때문에 Python을위한 다른 typemap을 작성해야합니다. [this technique] (http://www.swig.org/Doc1.3/Typemaps.html#Typemaps_nn43)을 사용하면이 부분을 간소화 할 수 있습니다. 파이썬의 경우''Typemap (out)'이 될 것입니다.하지만''PyList' '를 만듭니다. 템플릿 문제와 관련하여 가장 쉬운 방법은 아마도 각 템플릿 유형에 사용할 수있는 [SWIG 매크로] (http://www.swig.org/Doc2.0/Preprocessor.html#Preprocessor_nn6)를 정의하는 것입니다 너는 걱정한다. 프로세스는 입력에 대해 대칭입니다. – Flexo