所以我在我的 Java 代码中声明了一个全局整数数组,它只分配一次,我希望能够在我的 JNI 代码的初始化例程中缓存一个原始指针。这甚至可能吗(或者虚拟机是否保留将数组副本交给我的权利)?如果不是,我是否可以改为从 JNI 端分配内存(例如通过 NewIntArray),然后将其传递给 Java 代码一次以进行缓存?
任何建议,将不胜感激!
所以我在我的 Java 代码中声明了一个全局整数数组,它只分配一次,我希望能够在我的 JNI 代码的初始化例程中缓存一个原始指针。这甚至可能吗(或者虚拟机是否保留将数组副本交给我的权利)?如果不是,我是否可以改为从 JNI 端分配内存(例如通过 NewIntArray),然后将其传递给 Java 代码一次以进行缓存?
任何建议,将不胜感激!
数组,就像所有其他对象一样,可以由垃圾收集器在堆内存中移动。如果您想要一个不会移动的数据块(并且您可以将指针缓存到其中),则需要使用 off-heap ByteBuffer
。
在 JNI 中,您可以使用以下函数创建一个:使用并调用此函数NewDirectByteBuffer
在 Java 堆之外保留内存,以创建一个包装内存的对象。malloc
ByteBuffer
如果你想从 Java 端创建缓冲区,你有ByteBuffer.allocateDirect
. 然后,JNI 函数GetDirectBufferAddress
返回指向原始内存缓冲区的指针。
看看这个Returning jint array from c to java through jni。问题似乎与您的问题非常相似。
基本上,如果将 int 数组传递给 java 中的方法,则可以在 jni 中将其作为jintArray
类型访问。
我不知道正在制作副本,基本上在 jni 中您可以访问与 java 代码中相同的对象。