2023-01-20 279
我需要我的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);
}
我被困在这里,我可以做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/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态