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

时间:2012-11-14 19:47:04

标签: java android c++ android-ndk java-native-interface

我的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吗?或者它必须是一个字符

我想说我想给这个dbuf写1,2,3,4,5,我该怎么做? 我在想dbuf.put(1); ... dbuf.put(5)但它不起作用。 在填充之后,我只是在java中调用bb.get(position)吗?

有人为我澄清这个,例子将不胜感激 谢谢

这是我的原生方法表

static JNINativeMethod method_table [] = {

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

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

1 个答案:

答案 0 :(得分:8)

  

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

这可能与您的问题无关,但您必须做一个或另一个。您需要在onLoad函数中执行Java-to-Native方法映射,或者使用javah生成JNI可以在运行时获取的方法签名。否则,永远不会调用您的本机方法。

但是,如果正确调用了本机方法,那么无论你做什么都可能没问题。

  

我被困在这里,我可以做双dbuf吗?或者它必须是一个炭?

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

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

我想说我想给这个dbuf写1,2,3,4,5,我该怎么做?

C / C ++中用于访问数组中值的符号带有[]符号,即:

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

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

填充后,我只是在java中调用bb.get(position)吗?

是的,您可以使用ByteBuffer上的访问者方法来访问您从本机代码中编写的数据。