JNI

JNI,第1张

JNI

字节从Java传递到本机代码的最有效方法是什么?我可以将其作为字节数组访问。我没有看到将其作为字节缓冲区(包装此字节数组)与此处的字节数组传递任何特殊优势。

Direct的最大优点

ByteBuffer
是您可以
GetDirectByteBufferAddress
在本机端进行调用,并且立即有了指向缓冲区内容的指针,而没有任何开销。如果传递字节数组,则必须使用
GetByteArrayElements
ReleaseByteArrayElements
(它们可能会复制该数组)或关键版本(它们会使GC暂停)。因此,使用直接
ByteBuffer
指令可以对代码的性能产生积极影响。

如您所说,(i)不起作用,因为您不知道该方法将返回多少数据。(ii)由于该定制包装协议而过于复杂。我将使用(iii)的修改版本:不需要该对象,您可以返回

ByteBuffer
s
的数组,其中第一个元素是哈希,其他元素是缩略图。这样您就可以 丢掉所有
memcpy
s了
!这就是直接的全部要点
ByteBuffer
:避免复制。

码:

void Java_MyClass_createThumbnails(JNIEnv* env, jobject, jobject input, jobjectArray output){    jsize nThumbnails = env->GetArrayLength(output) - 1;    void* inputPtr = env->GetDirectBufferAddress(input);    jlong inputLength = env->GetDirectBufferCapacity(input);    // ...    void* hash = ...; // a pointer to the hash data    int hashDataLength = ...;    void** thumbnails = ...; // an array of pointers, each one points to thumbnail data    int* thumbnailDataLengths = ...; // an array of ints, each one is the length of the thumbnail data with the same index    jobject hashBuffer = env->NewDirectByteBuffer(hash, hashDataLength);    env->SetObjectArrayElement(output, 0, hashBuffer);    for (int i = 0; i < nThumbnails; i++)        env->SetObjectArrayElement(output, i + 1, env->NewDirectByteBuffer(thumbnails[i], thumbnailDataLengths[i]));}

编辑:

我只有一个字节数组可用于输入。不会将字节数组包装在字节缓冲区中仍然产生相同的负担吗?我也对数组使用了以下语法:http : //developer.android.com/training/articles/perf-
jni.html#region_calls。虽然仍然可以复制。

GetByteArrayRegion
总是写到缓冲区,因此每次都创建一个副本,所以我建议
GetByteArrayElements
使用。将数组复制到直接
ByteBuffer
Java端上也不是最好的主意,因为您仍然拥有该副本,如果
GetByteArrayElements
将数组固定,最终可以避免。

如果我创建包装本地数据的字节缓冲区,谁负责清理它?我之所以做memcpy,只是因为我认为Java不知道何时释放它。该内存可能在堆栈上,在堆上或在某些自定义分配器上,这似乎会导致错误。

如果数据在堆栈上,则 _ 必须_
将其复制到Java数组中,该数组

ByteBuffer
是用Java代码创建的直接指令或在堆上的某个
ByteBuffer
位置(并且该指令指向该位置)。如果它在堆上,那么只要可以确保没有人释放内存,就可以安全地使用
ByteBuffer
您使用创建的直接
NewDirectByteBuffer
指令。释放堆内存后,您必须不再使用该
ByteBuffer
对象。
ByteBuffer
使用
NewDirectByteBuffer
GC
创建的直接目录时,Java不会尝试删除本机内存。您必须手动进行处理,因为您还手动创建了缓冲区。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/4910783.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-12
下一篇 2022-11-12

发表评论

登录后才能评论

评论列表(0条)

保存