gpt4 book ai didi

java - 从 JNI 中编码数据的最快方法是什么

转载 作者:行者123 更新时间:2023-11-30 09:41:34 25 4
gpt4 key购买 nike

假设我有一个包含许多数据字段(>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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com