当前位置: 首页 > 面试题库 >

如何读写从java传递给jni的字节缓冲区

子车凯泽
2023-03-14
问题内容

我的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 method_table [] = {

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

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


问题答案:

我不使用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)?

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



 类似资料:
  • 用这种方式将字节缓冲符转换为字符串是否正确, 我问这个问题的原因是,这看起来太简单了,而像Java这样的其他方法:将字符串转换成字节缓冲符和相关问题看起来更复杂。

  • 问题内容: 我知道 bufio 包中的golang中的特定功能。 Peek返回下一个n个字节, 而不会使阅读器前进 。在下一个读取调用中,字节停止有效。如果Peek返回的字节数少于n个字节,则它还会返回一个错误,解释读取短的原因。如果n大于b的缓冲区大小,则错误为ErrBufferFull。 我需要能够从阅读器读取特定数量的字节,以 使阅读器更先进 。基本上,与上面的功能相同,但是它使阅读器更高级

  • 如何在标准C++/C++11(无POSIX函数)中优化std::ifstream和std::ofstream的读写速度?(1<-由于有几个问题,这些数字标识了不同点) 我不知道缓冲区的确切作用,所以你能确认一下吗: 用于读取:文件的大部分预加载在内存中(因此缓冲区大小定义了这大部分的大小)(2) 写入:数据写入内存,一旦缓冲区满了,数据就从内存传输到文件系统(3) 如何设置std::ifstrea

  • 问题内容: 我有一个Java程序,它将一些文本输出到控制台。它使用,和其他一些方法来执行此操作。 在程序的最后,我想读取控制台中的所有文本并将其复制到String缓冲区中。我该如何用Java做到这一点?我需要阅读和独立。 问题答案: 好的,这是一个有趣的问题。似乎不是一种同时解决所有方法的优雅方法。(不幸的是没有。) 我确实写了一个丑陋的基于反射的解决方法(我想不要在生产代码中使用它:) …可以像

  • 本文向大家介绍Java缓冲读取器,包括了Java缓冲读取器的使用技巧和注意事项,需要的朋友参考一下 示例 介绍 该BufferedReader班是以外的包装Reader是有两个主要目的类: ABufferedReader为包装的提供缓冲Reader。这允许应用程序一次读取一个字符,而不会产生过多的I / O开销。 一个BufferedReader用于一次读取文本行提供的功能。 使用Buffered

  • 问题内容: 我有以下从缓冲读取器读取数据的示例: 每当缓冲读取器中出现某些情况时(在这种情况下),将执行循环中的代码。在我的情况下,如果客户端应用程序将某些内容写入套接字,则将执行循环中的代码(服务器应用程序中)。 但是我不明白它是如何工作的。等待直到缓冲读取器中出现某些内容,当其中出现某些内容时,它将返回并执行循环中的代码。但是什么时候可以退货。 还有另一个问题。上面的代码摘自一个方法,我在线程