2017-10-25 3 views
1

이것은 간단한 문제 일 것이라고 생각했지만 답변을 찾는 데 어려움이있었습니다.SWIG - Java 프록시 클래스 배열 매개 변수

나 C++에 정의 된 구조체를 가지고, 이제 가정 해 봅시다 :

struct MyStruct 
{ 
    int a; 
    int b; 
}; 

이는 SWIG로 자바 프록시 클래스 MyStruct에 랩됩니다.

void myFunction(struct MyStruct arg[], int amount); 

SWIG 포인터 파라미터를보고, 따라서 그것의 파라미터로서 단일 MyStruct 오브젝트 사용하는 함수의 Java 랩퍼 생성 :

void myFunction(MyStruct arg, int amount) { /**/ } 
를 I는 struct MyStruct의 배열을 얻어 C++의 기능을 갖는다

SWIG에서 MyStruct Java 객체 배열을 가져 오는 Java 함수를 생성하려면 어떻게해야합니까? 필자는 원시 타입의 배열을 이해할 수 있었지만 사용자 정의 래핑 된 타입에서 작동하도록하는 방법을 찾지 못했습니다.

그래서 내 원하는 자바 함수 서명이 될 것입니다 :

void myFunction(MyStruct[] arg, int amount); 

편집 : 업데이트 문구 프록시 클래스의 적절한 꿀꺽 꿀꺽 명칭을 사용.

+0

이것은 실제로 가변적 인 함수입니까? – Flexo

+0

@Flexo 아니, 죄송합니다. 구문이 어떻게 혼란 스러울 지 생각하지 않았습니다. P 대답을 명확히하기 위해 편집했습니다. –

+0

C++은 배열의 길이를 어떻게 알 수 있습니까? 그것은 고쳐 졌습니까? 아니면 마술 최종 가치? 또는 생략 된 인수 중 하나? (내가하고있는 것은 실제, 작동하지만 최소한의 예가 필요한 것을 정확히 이해하는 것이 더 쉽다는 것입니다.) – Flexo

답변

0

나는 및 javain 타입 맵과 함께 carrays.i의 %array_class을 사용하여 생성 된 중간 배열 클래스를 사용하여 작업 솔루션을 만들 수있었습니다. 이 솔루션의 완전한 작동 예제는 내 gist에서 찾을 수 있습니다.

누구든지 더 나은 솔루션이나 개선점을 생각해 낼 수 있다면 큰 도움이 될 것입니다. 내 솔루션의 단점은 이러한 방식으로 사용하려는 각기 다른 프록시 클래스에 대해 Java 배열 프록시 클래스를 추가로 만들어야한다는 점입니다. 이로 인해 Java API가 복잡해집니다. javaclassmodifiers typemap을 사용하여 배열 프록시 클래스 package-private을 만들면이 기능을 약간 향상시킬 수 있습니다.