簡體   English   中英

如何在JNA中傳遞包含原始類型數組的結構?

[英]How to pass a struct including a array of primitive type in JNA?

我是JNA的新手開發人員,因此,如果這個問題很瑣碎,請原諒我,但我努力避免使用CNA結構對象,包括JNA的float數組。 目前,我收到了一個編譯錯誤。

我認為問題是初始化FloatByReference實例( mys.Weights )並將其分配給mystruct類實例( mys )的錯誤方法,並且認為不應修改以下Java代碼,因為JNAerator自動生成了它。

我的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)提取所需的數據。

您需要分配Memory並使用Memory.write()將Java基本浮點數組寫入本機內存,然后再將該內存分配給您的結構字段。

FloatByReference基本上是指向一個已分配浮點的指針。 JNAerator根本無法分辨出指向單個浮點數的指針與指向浮點數的緩沖區的指針之間的區別(如果沒有其他上下文,人類也不會)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM