1

所以我在我的 Java 代码中声明了一个全局整数数组,它只分配一次,我希望能够在我的 JNI 代码的初始化例程中缓存一个原始指针。这甚至可能吗(或者虚拟机是否保留将数组副本交给我的权利)?如果不是,我是否可以改为从 JNI 端分配内存(例如通过 NewIntArray),然后将其传递给 Java 代码一次以进行缓存?

任何建议,将不胜感激!

4

2 回答 2

3

数组,就像所有其他对象一样,可以由垃圾收集器在堆内存中移动。如果您想要一个不会移动的数据块(并且您可以将指针缓存到其中),则需要使用 off-heap ByteBuffer

在 JNI 中,您可以使用以下函数创建一个:使​​用并调用此函数NewDirectByteBuffer在 Java 堆之外保留内存,以创建一个包装内存的对象。mallocByteBuffer

如果你想从 Java 端创建缓冲区,你有ByteBuffer.allocateDirect. 然后,JNI 函数GetDirectBufferAddress返回指向原始内存缓冲区的指针。

于 2013-09-21T14:37:36.680 回答
0

看看这个Returning jint array from c to java through jni。问题似乎与您的问题非常相似。

基本上,如果将 int 数组传递给 java 中的方法,则可以在 jni 中将其作为jintArray类型访问。

我不知道正在制作副本,基本上在 jni 中您可以访问与 java 代码中相同的对象。

于 2013-09-21T14:39:15.807 回答