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

如何在JNI中从GetDirectBufferAddress调用多种数据类型?

殷浩慨
2023-03-14
问题内容

bytebuffer通过本机方法获得了。

bytebuffer3个开始ints,则仅包含双打。第三个int告诉我接下来的双打次数。

我能够阅读前int三秒。

为什么在我尝试读取双打时代码崩溃?

获得前三个整数的相关代码:

JNIEXPORT void JNICALL test(JNIEnv *env, jobject bytebuffer)
{
   int * data = (int *)env->GetDirectBufferAddress(bytebuffer);
}

获得剩余双打的相关代码:

double * rest = (double *)env->GetDirectBufferAddress(bytebuffer + 12);

问题答案:

在您发布的代码中,您将其称为:

double * rest = (double *)env->GetDirectBufferAddress(bytebuffer + 12);

这会将12加到bytebuffer jobject,而不是数字。

GetDirectBufferAddress()返回一个地址;由于前3 int个字节各为4个字节,因此我相信您正确地添加了12个字节,但未
在正确的位置添加它

您可能打算这样做:

double * rest = (double *)((char *)env->GetDirectBufferAddress(bytebuffer) + 12);

对于您的总体代码,要获取前三个ints和其余的doubles,请尝试类似以下操作:

void * address = env->GetDirectBufferAddress(bytebuffer);
int * firstInt = (int *)address;
int * secondInt = (int *)address + 1;
int * doubleCount = (int *)address + 2;
double * rest = (double *)((char *)address + 3 * sizeof(int));

// you said the third int represents the number of doubles following
for (int i = 0; i < doubleCount; i++) {
    double d = *rest + i; // or rest[i]
    // do something with the d double
}


 类似资料:
  • 问题内容: 我正在尝试从JNI层了解如何使用。为了理解,我构建了一个非常简单的示例: 然后从本地JNI层: 如果我使用openjdk在此处(debian / linux wheezy amd64)运行此示例: 这是我看到的: 我了解索引2和3的值。但是所有其他值对我来说都没有任何意义,我原本希望这样: 我从JNI的ByteBuffer使用中误解了什么? 问题答案: 我从文档中错过的是默认情况下实际

  • 问题内容: 因此,我正在编写一个使用大型c 库的Android应用。我可以正常工作,以便Java应用程序可以调用c 委托方法,但是我发现自己希望自己可以将来自c 的消息记录到Android日志中。从Java上这很容易,但是我不知道如何从c 调用Java方法。我的搜索找到了从c 打开jvm的方法,这根本不是我想要做的。理想情况下,我想将日志方法指针传递给c ,然后可以在需要时使用它。当然,Java不

  • 问题内容: 我真的很难弄清楚如何使用JNI从Objective-C调用Java函数。 我首先要说的是,我对Java并不了解很多,但是对Obj- C非常熟悉。我有一个带有单个方法的Java类,需要从我的应用程序包中调用它。该jar位于包中的Resources文件夹内,并且我将其设置为,它被检查并包含2个jar文件的名称(主要是一个,一个依赖)。 我正在通过调用来启动虚拟机,然后尝试使用该类来查找类,

  • 我有两种不同类型的Avro数据,它们有一些公共字段。我想在映射器中读取这些公共字段。我想通过在集群中生成单个作业来阅读本文。 下面是示例avro模式 模式1: {“type”:“record”,“name”:“Test”,“namespace”:“com.abc.schema.SchemaOne”,“doc”:“Avro使用MR.存储模式”,“fields”:[{“name”:“EE”,“type

  • TL;博士我在通过线程将FFMPEG原始数据从C代码传递到JAVA代码(用于显示)时遇到问题。 有一个服务器可以向其客户端发送编码帧。这些编码的帧是用一些FFMPEG魔法编码的。在客户端接收时,前面提到的帧被解码为原始RGB数据(作为无符号字符*)。现在的问题是,帧在某种“侦听器”中被接收。只要一个线程在后台运行,轮询服务器,并在新帧可用时运行特定的功能。 当前以视频格式显示帧的解决方案是将每个帧

  • 我正在制作一个库应用程序,该应用程序使用谷歌断路器检测android中的本机崩溃。每当我的主端发生本机崩溃时,断路器都会调用以下回调。从这个回调中,我需要使用JNI在java类中调用一个静态val方法。 这是我的java方法: 在Android5.0之前,这一功能一直运行良好。但在Lollipop中,我无法调用我的java方法,因为我无法在Logcat控制台上看到“内部句柄异常”日志。 以下是我在