我的 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/