2012-11-29 18 views
1

如何将C中的数组(如long *val)返回给Java代码?返回从C到Java的长整型数组

如果这样做是不可能的,我怎么可以返回一个数组到Java?

+0

为什么-1?请评论并告诉我为什么。 – JuiCe

回答

1

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

免责声明:堆,栈及以上的其它术语绝对没有做标准C.出于实用的目的,我认为他们的存在,但你的目的,试图获得的想法,你不应该” t指向不存在的内存,然后取消引用您的指针。

现在,因为这涉及到JNI和Java,所以有一些问题。首先,Java数组不是以与数组相同的方式放置在内存中的。在Java中,不能保证数组的元素将被连续存储。我认为还有其他许多问题,但我并不完全是这个领域的专家。

那么,有什么解决方案?

选择一种方法。您要么必须登录copy your array of long into a Java jLongArray as outlined in this post,要么设计一个API来访问您在Java中用C分配的内存。

但是,没有选择将指向数组的指针返回给Java,并且只是访问它的C风格。 Java没有指针,而Java不是C.

+0

谢谢。我知道这是不正确的,但对C知道什么是不正确的知之甚少。 – JuiCe

+0

另请参阅Android JNI技巧文档 - http://developer.android.com/training/articles/perf-jni.html#faq_sharing。 – fadden

1

您需要比log * val更多的值,还需要C数组中的项数。然后你只需将它转换为一个这样大小的数组。