假设我有一个包含许多数据字段(>15)的 C 数据结构:
struct MyData
{
int x;
float y;
...
}
在 Java 中,我可以将指向 MyData 的指针存储为 long,并通过 JNI 调用访问 C 数据结构的成员:
long mydata_p = MyDataJNI.alloc();
int x = MyDataJNI.getX( mydata_p );
float y = MyDataJNI.getY( mydata_p );
...
但是,对这些函数的调用非常昂贵(相当于 C 函数调用成本的 10 到 100 倍)。即使实现 getX, getY, ... 如此简单也是如此:
return ((MyData*)())->x
Q1:为什么 JNI 调用如此昂贵?除了对函数指针的调用之外还有什么发生了? (作为引用,我正在查看 Android 中的 JNI 调用。)
问题 2:要使我的 C 结构的所有元素在 Java 层可用,最快的方法是什么?
最佳答案
您想通过一次 JNI 调用移动所有数据。您可以将它复制到原始字节数组中(然后使用 ByteArrayOutputStream 和 DataOutputStream 的某种组合从中提取 Java 原始数据),或者使用直接的 NIO ByteBuffer (ByteBuffer.allocateDirect),如果您需要将数据移回,这更有意义来回。直接 ByteBuffer 是专门为在 VM 和 native 代码之间共享内存而设计和优化的。
关于java - 从 JNI 中编码数据的最快方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8979187/