我很难理解 sun.misc.Unsafe 的文档——我猜因为它不适合一般用途,所以没有人真正关心让它可读——但我真的需要一种方法来找到它的地址数组中的一个元素(以便我可以将指向它的指针传递给 native 代码)。有没有人有任何工作代码可以做到这一点?靠谱吗?
最佳答案
您可以使用 ByteBuffer.allocateDirect() 直接缓冲区,而不是使用数组。这在字段中具有地址,并且此地址在 ByteBuffer 的生命周期内不会改变。直接 ByteBuffer 使用最小的堆空间。可以通过反射获取地址。
你可以使用Unsafe来获取地址,问题是GC可以随时移动它。对象在内存中不是固定的。
在 JNI 中,您可以使用特殊方法将数据复制到 Java 对象或从 Java 对象复制数据以避免此问题(以及其他问题)如果您想使用 C 代码在对象之间交换数据,我建议您使用这些方法。
关于java - 使用 sun.misc.Unsafe 获取 Java 数组项的地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7934779/