如何将C中的数组(表示为long *val
)返回给Java代码?
如果无法以这种方式执行此操作,我还能如何将数组返回给Java?
答案 0 :(得分:1)
您需要的不仅仅是log * val,还需要C数组中的项目数。然后你只需将它转换为那个大小的数组。
答案 1 :(得分:1)
要开始,在C中你不能返回数组类型。在您的问题中,您引用“C中的数组,表示为long * val”。那不是阵列。如您所知,long *
是指向long 的指针。那么,为什么这很重要?因为你正在返回一个指针。不是数组。这意味着您需要确保指针指向的内存将在用户尝试引用时分配。 C中的常见错误是返回指向自动存储器中分配的内存的指针(即在函数本身的堆栈帧中)。这是错误的。如果你从一个函数返回一个指针,那么该指针应该指向以下内存:在该函数上方的堆栈帧上,所以我们知道它仍然被分配,例如在main()
中分配的内存,静态已分配的内存(例如全局数组)或堆上分配的内存(例如malloc()
返回的内存)。
免责声明:上面使用的堆,堆栈和其他术语与标准C完全没有没有。出于实际目的,我认为它们存在,但为了您的目的,尝试获取想法你不应该指向那里不存在的内存,然后取消引用你的指针。
现在,由于这与JNI和Java有关,因此存在一些问题。首先,Java数组不像数组在C中那样在内存中布局。在Java中,无法保证数组的元素将被连续存储。我认为还有无数其他问题,但我不是这个领域的专家。
那么,解决方案是什么?
选择一种方法。您要么必须copy your array of long into a Java jLongArray as outlined in this post,要么设计一个API来访问您在Java中用C分配的内存。
但是,没有选择将指向数组的指针返回到Java并且只是访问它的C风格。 Java没有指针,Java不是C。