나는 초보 JNA 개발자 이므로이 질문이 사소한 경우 용서해주십시오.하지만 JNA와 함께 float 배열을 포함하는 C-lang struct 객체를 처리하는 데 어려움을 겪고 있습니다. 현재 컴파일 오류가 발생했습니다.
문제는 FloatByReference 인스턴스 ( mys.Weights
) 를 초기화하고 mystruct 클래스 인스턴스 ( mys
)에 할당하는 잘못된 방법이라고 생각하며 JNAerator가 자동으로 생성했기 때문에 아래의 Java 코드를 수정해서는 안된다고 생각합니다.
내 C 코드 :
typedef struct
{
int n;
float *Weights;
} mystruct;
void testfunc(mystruct* mys){
printf(mys->Weights[0]);
}
public interface CLibrary extends Library {
public static final String JNA_LIBRARY_NAME = "test";
public static final NativeLibrary JNA_NATIVE_LIB = NativeLibrary.getInstance(CLibrary.JNA_LIBRARY_NAME);
public static final CLibrary INSTANCE = (CLibrary)Native.loadLibrary(CLibrary.JNA_LIBRARY_NAME, CLibrary.class);
및 Java :
public interface CLibrary extends Library {
public static final String JNA_LIBRARY_NAME = "test";
public static final NativeLibrary JNA_NATIVE_LIB = NativeLibrary.getInstance(CLibrary.JNA_LIBRARY_NAME);
public static final CLibrary INSTANCE = (CLibrary)Native.loadLibrary(CLibrary.JNA_LIBRARY_NAME, CLibrary.class);
public static class mystruct extends Structure {
public int n;
public FloatByReference Weights;
protected List<? > getFieldOrder() {
return Arrays.asList("n", "Weights");
}
public mystruct(int n, JnaeratorTestLibrary.feature_t.ByReference Features, FloatByReference Weights) {
super();
this.n = n;
this.Features = Features;
this.Weights = Weights;
}
public mystruct(Pointer peer) {
super(peer);
}
public static class ByReference extends mystruct implements Structure.ByReference {
};
public static class ByValue extends mystruct implements Structure.ByValue {
};
};
void testfunc(CLibrary.mystruct mys);
}
public static void main(String[] args) {
mystruct mys = new mystruct();
mys.n = 10;
mys.Weights = new FloatByReference();
// Compile error raises.
mys.Weights = new float[4]; mys.Weights[0] = 1.0;
testfunc(mys);
}
컴파일 오류 메시지 :
유형 불일치 : float []에서 FloatByReference로 변환 할 수 없습니다.
를 사용한 Pointer
다음을 사용 Pointer.getFloatArray(0, n)
하여 원하는 데이터를 추출하십시오.
해당 메모리를 구조 필드에 할당하기 전에 네이티브 메모리에 Java 기본 부동 소수점 배열을 작성하는 데 할당 Memory
하고 사용해야 Memory.write()
합니다.
FloatByReference
기본적으로 하나의 할당 된 float에 대한 포인터 입니다. JNAerator는 단순히 단일 부동 소수점에 대한 포인터와 부동 소수점 버퍼에 대한 포인터 간의 차이를 구분할 수 없습니다 (추가 컨텍스트 없이는 사람도 할 수 없음).
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다