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方法中取值的方式需要修改?望高手指教,如果在定长的数组下,能取到并计算正确的值?