9

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

这就是我得到的。在java中

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

本机方法

public static native void processBuffer(ByteBuffer bb);

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

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

    }

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

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

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

这是我的本地方法表

静态 JNINativeMethod 方法表 [] = {

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

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

4

1 回答 1

10

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

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

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

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

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

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访问您从本机代码写入的数据。

于 2012-11-14T20:41:47.933 回答