在JNI Android中返回字节数组?

16

我需要从JNI获取字节数组到Java中。 例如:我有一个字节数组 byte[] a = {1,2,3,4,5,6}

JNIEXPORT jbyteArray JNICALL Java_com_vn_getArray (JNIEnv *env, jobject obj) {
  jbyte[] a = {1,2,3,4,5,6};
  return a;

我不知道如何从jni返回一个字节数组。

有人可以帮帮我吗?拜托了!

2个回答

34

在Java中,数组是一个对象。因此,如果要将字节数组从C或C ++传递给Java,则需要实例化jbyteArray,并返回它,而不是C数组。为了解决这个问题,请参考以下代码:

JNIEXPORT jbyteArray JNICALL Java_Test_returnArray
  (JNIEnv *env, jobject This)
{
        jbyte a[] = {1,2,3,4,5,6};
        jbyteArray ret = env->NewByteArray(6);
        env->SetByteArrayRegion (ret, 0, 6, a);
        return ret;
}

根据这个链接


你有收到任何异常吗?在Java端,你能看到什么返回值? - TheDutchDevil
1
@DungQuang 请现在检查代码,我有更多时间来看它,并修复了一个相当尴尬的编译器错误。编辑后的代码对我有效,并在Java端返回一个包含六个计数的字节数组。 - TheDutchDevil
谢谢,我通过下面的代码解决了这个问题: JNIEXPORT jbyteArray JNICALL Java_com_example_json_bo_getArrray (JNIEnv *env, jobject o) { jbyte a[] = {1,2,3,4,5,6}; jbyteArray ret = (*env)->NewByteArray(env, 6); (*env)->SetByteArrayRegion (env, ret, 0, 6, a); return ret; } 感谢您的帮助! - Dung Quang

4

我很喜欢这个,而且它很有效

JNIEXPORT jbyteArray JNICALL Java_com_vn_getArray(JNIEnv *env, jobject obj) {
    jbyte byteUrl[] = {1,2,3,3,4};
    int sizeByteUrl = 5;

    jbyteArray data = (*env)->NewByteArray(env, sizeByteUrl);
    if (data == NULL) {
        return NULL; //  out of memory error thrown
    }

    // creat bytes from byteUrl
    jbyte *bytes = (*env)->GetByteArrayElements(env, data, 0);
    int i;
    for (i = 0; i < sizeByteUrl; i++) {
        bytes[i] = byteUrl[i];
    }

    // move from the temp structure to the java structure
    (*env)->SetByteArrayRegion(env, data, 0, sizeByteUrl, bytes);

    return data;
}

1
当你完成时,需要调用ReleaseByteArrayElements来释放字节。 - Nat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接