2013-07-31 1 views
1

제가 실수가 아니라면 JNA StructureStructure으로 확장해야하는 해당 Java 클래스의 public 필드를 사용하여 구조체를 빌드합니다. 내 문제는 내가 선언을 미리 알 수없는 구조체를 전달해야한다는 것이다 (런타임에 알려짐). 방금 Object s의 목록을 가지고 있는데, C 라이브러리는 struct에 대한 참조로 기대합니다. Structure 클래스를 계속 사용할 수 있습니까? 아니면 직접 크기, 정렬/포장을 다루는 메모리 개체를 직접 만들어야합니까? 예를 들어JNA : 알 수없는 구조체를 처리하는 방법은 무엇입니까?

:

/* native code */ 
typedef struct mystruct { 
    int x; 
    float y; 
} mystruct; 

void dosomething(mystruct * s) { 
    s->y += s->x; 
} 

그리고 자바는 :

... 
callFunctionWithSt("dosomething", 
    new Object[]{Integer.valueOf(2),Float.valueOf(3.0)}); 
... 

void callFunctionWithSt(String funcName, Object[] structVals) { 
    NativeLibrary nl = ... 
    Pointer arg = ... // or Memory ... or Structure 
    // build structure 
    for (Object objJava : structVals) { 
     valJna = convertFromJavaToJnaObject(objJava); 
     // fill structure 
    } 
    f.invoke(arg); 
} 

Object convertFromJavaToJnaObject(Object) { 
    // assume we know how to do this 
} 
+0

는 네이티브 API 예제를 제공 할 수 있습니까? 네이티브 코드가 불투명 한'struct'를 사용한다면'Pointer' 나'PointerType'을 사용하고 그 뒤에있는 메모리를 무시할 수있는 모든 연산이'struct *'에서 수행 될 때만 그렇게 할 수 있습니다. – technomage

+0

구조체를 참조로 전달할 때 일반적으로 수행되는 작업을 정확하게 수행해야합니다. 네이티브 코드는 불투명하지 않습니다. 단지 struct를 컴파일 할 때 몰라요. – leonbloy

답변

0

당신이 구조체의 내용을 알 수없는 경우, 다음은 "불투명"라고합니다.

불투명도가 struct * 인 경우 com.sun.jna.Pointer을 사용하여 구조 주소를 나타낼 수 있습니다.

+0

나는 내용을 알고있다, 그것은 단지 그것이 런타임에 그것을 안다. 포인터를 사용하려면 (메모리가되어야한다고 생각합니다.) 구조체가 수행하는 필드 정렬의 모든 계산을 myslef해야합니다. – leonbloy

+0

콘텐츠와 런타임 만 알면 그 곳에서 물건이 어디 있는지 계산해야한다는 것을 의미하지 않습니까? 아니면 다형성에 대해 이야기하고 있습니까? – technomage

+0

불투명'struct *'와 함께'Pointer'를 사용하는 방법에 대한 예제를 제공 할 수 있습니까? 특히'포인터 '를 어떻게 만들겠습니까? –

0

Structure을 계속 사용할 수 있습니다. 이처럼 인터페이스 방법을 정의합니다

interface SomeLib { 
    public static final SomeLib INSTANCE = 
     (SomeLib) Native.loadLibrary("SomeLib", SomeLib.class); 

    Pointer getSomeStruct(); 
} 

을 그리고 당신이 그것을 호출 할 때, 당신은이 작업을 수행 :

Pointer someValue = SomeLib.INSTANCE.getSomeStruct(); 
// do something here to determine what type it is 
SpecificStructure struct = new SpecificStructure(someValue); 
+0

이것은 구조체가 직접 반환되는 것으로 가정하지만 참조로 반환되는 경우 어떻게됩니까? 예 : 'int getSomeStruct (struct * s)'. 그것은 OP가 말하고있는 것처럼 보입니다. 왜냐하면 그는 "참조에 의해 구조체 전달하기"에 대해 언급하기 때문입니다. –

+0

아니요, 게시 한 코드는 참조로 수행하는 것이므로 여기에 포인터가 있습니다. 직접 반환하는 경우 그것을 처리하는 방법을 완전히 모르겠지만 구조체의 ByValue 하위 클래스를 만드는 것은 당신이 할 필요가 있다는 힌트입니다 추측하고있어. – Trejkaz

+0

좋아, 글쎄, 나는 C 언어에 익숙하지 않지만 "매개 변수"를 의미했다. 어쩌면 나는 OP를 오해했다. 여하튼, 나는이 주제에 대해 다른 질문 [여기] (http://stackoverflow.com/questions/44036223/dealing-with-opaque-structs-in-jna?noredirect=1&lq=1)을 요청했다. 매개 변수로 사용하는 방법을 알고 있다면 공유하십시오. –