gpt4 book ai didi

java - Android:将一些只读字节传递给 native C++ 的最有效方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:39:26 26 4
gpt4 key购买 nike

我有一个 Android 项目(针对 Android 1.6 及更高版本),其中包含用 C/C++ 编写的 native 代码,可通过 NDK 访问。我想知道最有效的方法是将字节数组从 Java 通过 NDK 传递到我的 JNI 胶层。我关心的是 NDK for Android 是否会复制字节数组,或者只是给我一个直接引用。我需要在 C++ 级别对字节进行只读访问,因此从我的角度来看,在幕后进行任何复制都是浪费时间。

在网上很容易找到关于此的信息,但我不确定最相关的信息是什么。示例:

Get the pointer of a Java ByteBuffer though JNI

http://www.milk.com/kodebase/dalvik-docs-mirror/docs/jni-tips.html

http://elliotth.blogspot.com/2007/03/optimizing-jni-array-access.html

那么有人知道在当前的 NDK 中执行此操作的最佳(最有效、最少复制)方法是什么吗?获取字节数组区域?获取字节数组元素?还有别的吗?

最佳答案

根据文档,GetDirectBufferAddress将在不复制数组的情况下为您提供引用。

但是,要调用此函数,您需要分配一个 direct buffer使用 ByteBuffer.allocateDirect() 而不是简单的字节数组。它有对应的 explained here :

A direct byte buffer may be created by invoking the allocateDirect factory method of this class. The buffers returned by this method typically have somewhat higher allocation and deallocation costs than non-direct buffers. The contents of direct buffers may reside outside of the normal garbage-collected heap, and so their impact upon the memory footprint of an application might not be obvious. It is therefore recommended that direct buffers be allocated primarily for large, long-lived buffers that are subject to the underlying system's native I/O operations. In general it is best to allocate direct buffers only when they yield a measureable gain in program performance.

关于java - Android:将一些只读字节传递给 native C++ 的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8528179/

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