이 문제의 일부는 여기에있는 일부 게시물에서 알 수 있습니다. 나는 그 부분을 살펴보고 행운을 가지고 테스트했습니다.JNA - byref 인수로 구조 배열을 사용하십시오.
CBadgeData 구조로 구현됩니다int elc_GetBadges(int nHandle, char* cErr, int* nRecCount, CBadgeData** arr)
은 다음과 같습니다 :
package test.elcprog;
import java.util.Arrays;
import java.util.List;
import com.sun.jna.Pointer;
import com.sun.jna.Structure;
public class CBadgeData extends Structure{
public static class ByReference extends CBadgeData implements Structure.ByReference { }
public int nBadgeID, nTrigger, nExtraData;
public String cName;
public CBadgeData(Pointer pointer){
super(pointer);
}
public CBadgeData(){ }
public String ToString() {
return nBadgeID + "," + nTrigger + "," + nExtraData + "," + cName;
}
@Override
protected List getFieldOrder() {
String[] s = new String[]{"nBadgeID","nTrigger","nExtraData","cName"};
return Arrays.asList(s);
}
}
내 마지막 시도는이 인수를 정교하고 나는 결과와 함께 제공된 CBadgeData 구조 배열를 채워야이 네이티브 메소드 서명이 이 메소드를 다음과 같이 호출하십시오 :
CBadgeData.ByReference[] badges = new CBadgeData.ByReference[max_items];
new CBadgeData.ByReference().toArray(badges);
int ret = inst.elc_GetBadges(handle, err, recCount, badges);
세분화 오류로 실패합니다.
내 질문 여기 elc_GetBadges
으로 전화 할 때 CBadgeData**
네이티브에 대한 인수로 Java 형식을 제공해야합니까?
편집 -1-
작동하지 않았다 (또는 널 포인터를 종료하지 않고) 배열 자신을 채우기 추가 원세그 충돌을 일으켰습니다.
Pointer[] pointers = new Pointer[max_items];
for(int i=0; i<max_items; i++){
pointers[i] = new CBadgeData.ByReference().getPointer();
}
int ret = inst.elc_GetBadges(handle, err, recCount, pointers);
이것은 오류의 원인이 없지만이 있어야 돌아 오는 구조체에 대한 변경이 경우 4 개 항목을 포함하지 보인다 :
int bid = new CBadgeData(pointers[i]).nBadgeID; // this returns null for all items
을 그때 technomage 제안 인수로 포인터 [] 사용 Seg로 유도 된 구조체에 명시 적 read()/write()를 사용하면 다시 읽습니다 (읽음) : 나는 아직도 여기에 무엇이 없습니까?
편집 -2-
흥미롭게도 - 네이티브 메소드를 호출 한 후, 올바른 결과를 얻을, 직접 Memory.get
를 사용하여 :
Memory m= (Memory)pointers[0];
System.out.println("1st int: "+m.getInt(0)); // this gets 24289 which is 5ee1
System.out.println("2nd int: "+m.getInt(4)); // this gets 3
System.out.println("3rd int: "+m.getInt(8)); // this gets 255
System.out.println("String: "+m.getString(12)); // this gets "Badge[5EE1]" as supposed
하지만 여전히 충돌합니다 read()
. 이견있는 사람?
메모리 덤프가 주소 순서로 바이트를 인쇄합니다. int (little-endian)에서 최하위 바이트가 먼저 나타나므로 [e15e0000]은 값 00005ee1을 나타냅니다. 이것을 바이트 순서라고하는데, 정렬과 같은 것이 아닙니다. – technomage
기본 및 Java 구조 정의를 게시하십시오. – technomage
저는 (q에서 삭제되었습니다) 이해합니다. 'Memory() '를 읽는 동안'read()'에 문제가있을 수 있습니다. – Aditi