JNI本机函数内的自定义内存分配

时间:2014-08-18 16:38:01

标签: java c memory-management java-native-interface

我需要在JNI C函数中分配字节数组。然后将此数组作为byte[]对象传输到Java代码中。我知道有一个函数NewByteArray,但它只是输入字节数组的大小,所以我不能使用自定义内存分配函数。在我的情况下,我需要使用Linux中非常具体的非标准malloc类分配函数。由于资源非常有限,不应该进行额外的复制。

2 个答案:

答案 0 :(得分:2)

你不能这样做。通过JNI发送到Java的数据必须来自Java内存池。您无法从其他任何地方分配它,因为它将被视为java对象,这意味着Java GC将移动它并根据需要将其删除。

你必须使用NewByteArray,然后你可以从你想要的任何C指针初始化数组,以你想要的任何方式分配。但它必须将这些值复制过来。

答案 1 :(得分:2)

如果使用byte[],则必须从Java堆中分配它并允许它控制内存管理。

但是,您可以使用ByteBuffer,它允许您在本机代码中执行内存管理。您可以在本机代码中分配一块内存,并从Java访问它而无需复制。