제가 실수가 아니라면 JNA Structure은 Structure
으로 확장해야하는 해당 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
}
는 네이티브 API 예제를 제공 할 수 있습니까? 네이티브 코드가 불투명 한'struct'를 사용한다면'Pointer' 나'PointerType'을 사용하고 그 뒤에있는 메모리를 무시할 수있는 모든 연산이'struct *'에서 수행 될 때만 그렇게 할 수 있습니다. – technomage
구조체를 참조로 전달할 때 일반적으로 수행되는 작업을 정확하게 수행해야합니다. 네이티브 코드는 불투명하지 않습니다. 단지 struct를 컴파일 할 때 몰라요. – leonbloy