在jni android中返回字节数组?

时间:2014-10-28 07:55:24

标签: android android-ndk java-native-interface

我需要从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 个答案:

答案 0 :(得分:21)

在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;
}

基于此link

答案 1 :(得分:2)

我喜欢它并且它正在工作

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;
}