gpt4 book ai didi

java - 如何写入和读取从java传递给jni的bytebuffer

转载 作者:可可西里 更新时间:2023-11-01 18:29:36 26 4
gpt4 key购买 nike

我的 android 项目需要帮助。我想将缓冲区从 java 传递到 jni,我的 C++ 代码将填充数据。然后java将它们显示在屏幕上。我对 C++ 不太熟悉,不知道如何写入缓冲区。

这就是我得到的。在Java中

ByteBuffer bb = ByteBuffer.allocateDirect(216);
IssmJni.processBuffer(bb);

本地方法

public static native void processBuffer(ByteBuffer bb);

我不使用jni_onload,所以没有javah在 C++ 中

static void fillBuffer(JNIEnv *env, jclass clazz, jobject buf)
{
double *dBuf = env->GetDirectBufferAddress(env, buf);

}

我卡在这里了,我可以做双 dbuf 吗?还是必须是字符

假设我想将 1、2、3、4、5 写入此 dbuf,我该怎么做?我在考虑 dbuf.put(1); ... dbuf.put(5) 但它不起作用。在填充它之后,我只需要在 java 中调用 bb.get(position) 吗?

请有人为我澄清一下,示例将不胜感激谢谢

这是我的本地方法表

静态 JNINativeMethod method_table[] = {

{"fac"      ,     "(J)J" , (void *) factorial},
{"getBuffer", "()[D" , (void *) getBufferNative},
//{"processBuffer", "(Ljava/nio/ByteBuffer)V", (void *) fillBuffer}};

除最后一个外,其他两个工作正常。

最佳答案

I don't use jni_onload, so no javah in C++

这可能与您的问题无关,但您必须做其中之一。您需要在 onLoad 函数中进行 Java 到 native 方法映射,或者使用 javah 生成 JNI 可以在运行时获取的方法签名。否则您的本地方法将永远不会被调用。

但是,如果您的 native 方法被正确调用,那么无论您做什么都可能没问题。

I am stuck here, can I do double dbuf? or is it has to be a char?

函数的返回值实际上是一个void*,所以你可以把它转换成任何你想要的指针类型,因为它只是一个内存地址。但是,直接缓冲区的实际数据类型将是 jbyte,它是 signed char 的类型定义,因此以下可能是最好的:

jbyte *dBuf = env->GetDirectBufferAddress(env, buf);

Let said I want to write 1,2,3,4,5 to this dbuf, how do I do it?

在 C/C++ 中访问数组中的值的表示法是使用 [] 表示法,即:

jbyte *dBuf = env->GetDirectBufferAddress(env, buf);

dBuf[0] = 63;
dBuf[1] = 127;
// ...and so on...

and after populating it, do I just call bb.get(position) in java?

是的,您可以使用 ByteBuffer 上的访问器方法来访问您从 native 代码写入的数据。

关于java - 如何写入和读取从java传递给jni的bytebuffer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13386176/

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