1

如何将 C 中的一个数组(表示为long *val)返回给 Java 代码?

如果无法以这种方式执行此操作,我还能如何将数组返回给 Java?

4

2 回答 2

1

您需要的不仅仅是 log *val,还需要 C 数组中的项目数。然后,您只需将其转换为该大小的数组。

于 2012-11-29T20:40:00.750 回答
1

首先,在 C 中不能返回数组类型。在您的问题中,您指的是“C 中的一个数组,表示为 long *val”。那不是数组。你应该知道,long *是一个指向 long的指针。那么,为什么这很重要?因为你要返回一个指针。不是数组。这意味着您需要确保在用户尝试引用它时分配指针指向的内存。C 中的一个常见错误是返回指向在自动存储中分配的内存(即在函数本身的堆栈帧中)的指针。这是错误的。如果您从函数返回一个指针,则该指针应指向以下任一内存: 在该函数上方的堆栈帧上,因此我们知道它仍在分配,例如在main(),分配的静态内存(例如全局数组),或在堆上分配的内存(例如返回的内存malloc())。

免责声明:上面使用的堆、堆栈和其他术语与标准 C 完全无关。出于实际目的,我假设它们存在,但出于您的目的,请尝试理解您不应该指向的内存't 那里然后取消引用你的指针。

现在,由于这与 JNI 和 Java 有关,因此存在一些问题。首先,Java 数组在内存中的布局方式与 C 中的数组不同。在 Java 中,不能保证数组的元素会连续存储。我认为还有无数其他问题,但我并不完全是该领域的专家。

那么,解决方案是什么?

选择一种方法。您要么必须按照本文所述将 long 数组复制到 Java jLongArray 中,要么设计一个 API 来访问您在 C 中从 Java 分配的内存。

但是,没有选择将指向数组的指针返回到 Java 中并仅以 C 风格访问它。Java 没有指针,Java 也不是 C。

于 2012-11-29T20:42:53.997 回答