wfy8627 2024-08-09 16:00 采纳率: 60%
浏览 6
已结题

java利用JNA调用C方法的问题,定长数组和不定长数组的问题

JNA,java调用C方法的问题:
C中定义结构体:

typedef struct DoubleArrayStruct{
    int size;
    double arr[15];
} ;
 
typedef struct DoubleArray {
    int size;
    double* arr;

定义方法:
double sumDoubleArray(const DoubleArrayStruct * arrayStruct) {
    if (NULL == arrayStruct || arrayStruct->size == 0) {
        return 0;
    }
 
    double sum = 0;
    for (int i = 0; i < arrayStruct->size; i++) {
        double val = arrayStruct->arr[i];
        sum += val;
    }
 
    return sum;
}
double sumArray(const DoubleArray* arrayStruct) {
    if (NULL == arrayStruct || arrayStruct->size == 0) {
        return 0;
    }
    double sum = 0;
    for (int i = 0; i < arrayStruct->size; i++) {
        double val = arrayStruct->arr[i];
        sum += val;
    }
 
    return sum;

当使用java代码调用的时候:
java定义类:
public class DoubleArrayStruct extends Structure {
    public static class ByReference extends DoubleArrayStruct implements Structure.ByReference {
    }

    public static class ByValue extends DoubleArrayStruct implements Structure.ByValue {
    }

    // 属性要与动态库中的名称完全一致
    public int size;

    // double *
    public Pointer arr;

    @Override
    protected List<String> getFieldOrder() {
       return Arrays.asList("size", "arr");
    }
}

java定义方法:
double sumDoubleArray(DoubleArrayStruct reference);
double sumArray(DoubleArrayStruct reference);

调用:
DoubleArrayStruct ref1 = new DoubleArrayStruct();
ref1.setSize(15);
double[] arr= {1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0};

Pointer pointer1 = new Memory(arr.length * Native.getNativeSize(Double.TYPE));
 pointer1.write(0, arr, 0, arr.length);
 ref1.setArr(pointer1);  

double value1 = StructDoubleArrayLibrary.INSTANCE.sumDoubleArray(ref1);
       System.out.println("sumDoubleArray值: " + value1);
double value2 = StructDoubleArrayLibrary.INSTANCE.sumArray(ref1);
       System.out.println("sumArray值: " + value2);

执行结果:
sumDoubleArray值: 1.4360698017975E-311
sumArray值:: 120.0
两个方法的传值是一样的,C方法中唯一的区别是数组定长和不定长,本人C不太熟,理解当数组定长时,数组存值是数值还是指针的区别,不知道是java传值处应该修改,还是C方法中取值的方式需要修改?望高手指教,如果在定长的数组下,能取到并计算正确的值?
  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 已结题 (查看结题原因) 8月12日
    • 修改了问题 8月9日
    • 修改了问题 8月9日
    • 创建了问题 8月9日