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

标签 java android-ndk java-native-interface

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

相关文章:

c++ - 为什么我不能初始化静态成员

android-ndk - 找不到方法ndk()作为参数

java - 如何重新配置​​ eclipse 以使用 64 位 JVM

java - 从 ArrayList 中检索数据

java - 在 JAX-RS 中的每个 @POST 或 @DELETE 请求之前或之后调用方法

java - SunPKCS11 Provider初始化后如何完成?

android - 适用于 Android NDK 的 Googletest

java - JNI 栈顺序误解

java.lang.UnsatisfiedlinkError : Native method not found

java - Scala 中的 SOAP 代理——我需要什么?