将字节数组从本机代码传递到Java端 [英] Passing byte array from native code to the Java side

查看:140
本文介绍了将字节数组从本机代码传递到Java端的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的目标是将可变长度的字节数组从本机代码传递到Java端. Java类实例方法将bytearray作为其参数:

My goal is passing a byte array of variable length from native code to Java side. The Java class instance method takes bytearray as its argument:

private void writeBuffer(final byte[] buffer)
{
}

我能够在本机代码中找到方法ID:

I am able to find a method ID in the native code:

jclass cls = (*env)->FindClass(env,"class_path");
jmethodID writeBufferMethodID = (*env)->GetMethodID(env, cls, "writeBuffer", "([B)V");

但是仍然不知道如何正确地传递字节数组.我已经尝试过:

But still can't figure out how to pass a byte array properly. I have tried:

jbyteArray retArray = (*env)->NewByteArray(env, data_size);
void *temp = (*env)->GetPrimitiveArrayCritical(env, (jarray)retArray, 0);
memcpy(temp, decoded_frame->data[0], data_size);
(*env)->CallVoidMethod(env, obj, writeBufferMethodID, retArray);
(*env)->ReleasePrimitiveArrayCritical(env, retArray, temp, 0);

还有:

retArray = (*env)->NewByteArray(env, data_size);
(*env)->SetByteArrayRegion(env, retArray, 0, data_size, (jbyte *)decoded_frame->data[0]);
(*env)->CallVoidMethod(env, obj, writeBufferMethodID, retArray);

Java方法被调用,但是一段时间后应用程序崩溃了.而且,我收到的Java缓冲区中的所有值都等于零,因此似乎根本没有复制内容.

The Java method gets called, but after a while the application crashes. Moreover, all values in Java buffers I receive equal to zero so it seems the content is not copied at all.

我通过将其写入二进制文件验证了本机端的缓冲区内容(decoded_frame-> data [0]),没有问题,该文件完全符合我的期望.

I verified the buffers content (decoded_frame->data[0]) on the native side by writing them into the binary file and there is no problem, the file contains exactly what I expect.

我定期调用该方法;数组的大小可以在每个调用中变化.

I call that method periodically; the size of array can vary in each call.

什么是正确且最最有效的方式?在每次调用期间分配一个新数组显然是一个愚蠢的主意,但是我不知道如何在数组大小变化的情况下避免这种情况.

What is the correct and most effective way? Allocating a new array during each call is obviously a silly idea, but I do not know, how to avoid that if the array size varies.

我已经用这种方式重写了代码,现在看来还可以.

I have rewritten my code this way and it seems to be OK now.

在while循环中调用:

called in a while loop:

...进行一些解码...

...do some decoding...

if(!retArray)
retArray = (*env)->NewByteArray(env, data_size);

if((*env)->GetArrayLength(env, retArray) != data_size)
{
(*env)->DeleteLocalRef(env, retArray);
retArray = (*env)->NewByteArray(env, data_size);
}

void *temp = (*env)->GetPrimitiveArrayCritical(env, (jarray)retArray, 0);
memcpy(temp, decoded_frame->data[0], data_size);
(*env)->CallVoidMethod(env, obj, writeBufferMethodID, retArray);
(*env)->ReleasePrimitiveArrayCritical(env, retArray, temp, 0);

在循环出口处调用:

(*env)->DeleteLocalRef(env, retArray);

推荐答案

在调用CallVoidMethod之前,请尝试调用ReleasePrimitiveArrayCritical.

Try calling ReleasePrimitiveArrayCritical before you call CallVoidMethod.

这篇关于将字节数组从本机代码传递到Java端的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆