在 Java 项目里通过 JNA 调用 C 语言编写的动态库时,经常需要把数值数组交给本地代码处理。double 数组作为常用的浮点数据载体,其传递方式并不复杂,但需要注意 JNA 的类型映射规则。只要理解内存传递机制,就能在 Java 和 C 之间正确交换 double 数据。

一、C 函数如何接收 double 数组
我们先看一个最简单的 C 函数,它对传入的 double 数组求和并返回结果。C 语言里数组通常以指针形式接收,长度由另一个参数控制。
#include <stdio.h>
// 计算数组元素之和
double sum_double_array(double* arr, int len) {
double total = 0.0;
for (int i = 0; i < len; i++) {
total += arr[i];
}
return total;
}
将上述代码编译为动态库,例如 Linux 下生成 libcalc.so,Windows 下生成 calc.dll。
二、JNA 接口定义
JNA 中 Java 的 double[] 会自动映射为 C 的 double*,因此接口方法可直接声明数组参数。
import com.sun.jna.Library;
import com.sun.jna.Native;
public interface CalcLib extends Library {
// 加载动态库,Linux 为 libcalc.so,Windows 为 calc.dll
CalcLib INSTANCE = Native.load("calc", CalcLib.class);
// 对应 C 的 double sum_double_array(double* arr, int len)
double sum_double_array(double[] arr, int len);
}
三、Java 侧传递 double 数组
在 Java 中直接创建 double 数组并传入即可,JNA 会负责把数组内容复制到 native 内存。
public class Main {
public static void main(String[] args) {
double[] data = {1.1, 2.2, 3.3, 4.4};
double result = CalcLib.INSTANCE.sum_double_array(data, data.length);
System.out.println("求和结果: " + result);
}
}
注意事项
- 数组不能为 null,否则本地代码可能访问非法地址。
- 如果 C 函数会修改数组内容,JNA 默认在调用后把数据写回 Java 数组,可放心使用。
- 超大数组建议用
Memory类手动管理,避免 JVM 堆外内存压力。
四、常见错误
有些开发者误将 double 数组包装成 Double 对象数组,例如 Double[],这会导致 JNA 无法识别为基本类型指针,从而引发非法内存访问。务必使用基本类型 double[]。
小结:JNA 对基本类型数组的支持非常直接,记住用 double[] 对应 double*,长度单独传参,就能稳定实现 Java 到 C 的 double 数组传递。
JNAdouble_arrayC_function修改时间:2026-07-27 16:09:22