如何从爪哇传递到jni的Bytebuffer写作和阅读

 2023-01-20    279  

问题描述

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

这就是我得到的.
在Java

如何从爪哇传递到jni的Bytebuffer写作和阅读

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);

    }

我被困在这里,我可以做double dbuf吗?还是必须是char ?

让我想为这个DBUF写1,2,3,4,5,我该怎么做?
我正在考虑dbuf.put(1); … dbuf.put(5),但行不通.
填充它之后,我是否只致电Java中的bb.get(位置)?

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

这是我的本机方法表

静态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-to-Native方法映射,要么使用Javah生成JNI可以在运行时拾取的方法签名.否则您的本机方法将永远不会被调用.

如果适当地调用了本机方法,但是您所做的一切都可以.

我被困在这里,我可以做双DBUF吗?还是必须是char?

该函数的返回值实际上是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(位置)?

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

以上所述是小编给大家介绍的如何从爪哇传递到jni的Bytebuffer写作和阅读,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/26201.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。