2011-12-09 4 views
2

나는 C++ 기능을 가지고 : 나는 다음과 JNA 바인딩을 사용하는 경우JNA 직접 호출 인수 구조와 작동하지 않습니다 []

struct Result { 
    //... 
}; 
bool doSomething(Result[]); 

이, 함수 호출이 잘 작동 :

public class Result extends Structure { 
    //... 
} 

public interface CPPLibrary extends Library { 
    public static final CPPLibrary INSTANCE = (CPPLibrary)Native.loadLibrary("dllname"); 
    boolean doSomething(Result[]); 
} 

그러나 로 직접 호출, 나는 에 부딪쳤다.클래스 [Lcom.usta.Result; (com.usta.CPPLibrary 클래스의 calcPV01 메서드에서)이 지원되는 인수 유형이 아닙니다. 직접 전화 매핑에 대한 나의 JNA 코드 :

public class CPPLibrary implements Library { 
    Native.register("dllname"); 
    public static native boolean doSomething(Result[]); 
} 

내가 com.sun.jna.Function # convertArgument (에서 볼 수) 명시 적으로 구조 []하지만 com.sun.jna.Native를 처리 직접 호출 매핑에서 사용하는 #getConversion()구조 []을 처리하지 않습니다.

답변

0

변환은 간단합니다. 구조 배열의 첫 번째 요소에 대해 Structure.getPointer()를 호출하면됩니다 (처음에는 Structure.toArray에서 배열을 가져온 것으로 가정).

직접 매핑을 사용할 때 실제로 이점이 있습니다. 기본이 아닌 포인터가 아닌 유형을 전달할 때 JNI 계층은 해당 원시 데이터를 파생시키기 위해 VM을 다시 호출해야합니다.

직접 매핑에서 Structure [] 인수 지원에 대한 문제를 자유롭게 제기하십시오. 지원해야합니다 (JNA 문서는 포인터/문자열/WString/NativeMapped의 배열이 이 아니며을 지원함).

0

나는 다른 방법 서명을 사용하는 경우 :

boolean doSomething(Pointer results); 

이 작업을 수행합니다. 하지만 결과 []에서 포인터로 변환해야합니다.