0

bytebuffer通过本机方法得到一个。

bytebuffer3 ints 开始,然后只包含双精度数。第三个int告诉我接下来的双打数量。

我能够阅读前三个ints。

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

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

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

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

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

1 回答 1

4

在您发布的代码中,您调用的是:

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

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

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

您可能打算这样做:

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

对于您的整体代码,要获取最初的三个ints 和剩余double的 s,请尝试类似于以下内容:

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
}
于 2013-07-17T22:13:07.957 回答