没明白你的意思,你是不是想从jni返回一个byte数组?我直接从源码里弄了一个例子给你看看
private native byte[] onSaveInstanceStateNative(int handle);
static jbyteArray
onSaveInstanceState_native(JNIEnv* env, jobject clazz, jint handle)
{
    LOG_TRACE("onSaveInstanceState_native");    jbyteArray array = NULL;    if (handle != 0) {
        NativeCode* code = (NativeCode*)handle;
        if (code->callbacks.onSaveInstanceState != NULL) {
            size_t len = 0;
            jbyte* state = (jbyte*)code->callbacks.onSaveInstanceState(code, &len);
            if (len > 0) {
                array = env->NewByteArray(len);
                if (array != NULL) {
                    env->SetByteArrayRegion(array, 0, len, state);
                }
            }
            if (state != NULL) {
                free(state);
            }
        }
    }    return array;
}

解决方案 »

  1.   

    哦,谢谢回复,我的意思是: native New一个buffer ====>>>传给java ====>>>再次传到 native ,这时操作的话,就出错。不清楚为什么?
    回复:lieri111 
             既然不会回收,那么我通过什么函数来回收呢,我没有找到相关的函数啊????
      

  2.   

    你传给java的肯定是jbytearray 类型的不是指针
    在次传到native的话是byte[] value类型的.native层接收并处理就行了.有什么问题吗?
      

  3.   

    你传给java的肯定是jbytearray 类型的不是指针
    在次传到native的话是byte[] value类型的.native层接收并处理就行了.有什么问题吗?

    谢谢回复,请看下我的代码:
    jbyteArray Java_com_example_test_Getdata(JNIEnv *env, jobject thiz)
    {
    .................///一些其他获取数据的代码
         byteArray = (*env)->NewByteArray(env, size);
             if (byteArray == NULL)
             {
                return NULL;  
             }
            (*env)->SetByteArrayRegion(env, byteArray, 0, size,(jbyte *)data);
        return byteArray;
    }void Java_com_example_test_Setdata(JNIEnv *env, jobject thiz,jbyteArray jbuffer,jint size)
    { jbyteArray byteArray = NULL;
     
        jbyte data[size];
        (*env)->GetByteArrayRegion(env,jbuffer, 0, size, data);  ///<-----这里出问题,请教下为什么,谢谢!!!
        __android_log_print(ANDROID_LOG_INFO, "test", "test-----%.2x--%.2x--%.2x--%.2x--%.2x--%.2x--%.2x--",
                    size,
                    data[0],
                    data[1],
                    data[2],
                    data[3],
                    data[4],
                    data[5],
                    data[6]);
        return ;
    }
    然后在java层调用的函数是:  byte[] demoPtr=xxxx.Getdata(); 
      。。//一些其他的操作
      xxxx.Setdata(demoPtr,demosize);这样 就在native的 setData()函数中出错了,请问下为什么,谢谢!
      

  4.   

     
    GetByteArrayRegion最后一个参数要是(jbyte *)类型的
    参考以下:
    char* Utility::getByteArrayValue(JNIEnv* env, jbyteArray byteArray, int* dataLength) {
        char* data = NULL;
        if (NULL != byteArray) {
            jint length = env->GetArrayLength(byteArray);        *dataLength = length;
            if (0 < *dataLength) {
                data = new char[length];
                env->GetByteArrayRegion(byteArray, (jint)0, length, (jbyte *) data);
            }
        }
        return data;
    }PS:你的代码是C的,所以有 (*env)->.这个你别管,上面代码是C++的
    我看了下区别就是GetByteArrayRegion的最后一个参数类型
      

  5.   

    哦,谢谢,感动啊,这么热情的帮助,谢谢啊。
    还有一个不明白的是:
        这个我用NewByteArray分配的内存,需要自己释放还是java会回收,如果要自己释放,我应该调用哪个函数,谢谢?
      

  6.   

    (*env)->ReleaseByteArrayElements
    (*env)->DeleteLocalRef这样就可以清理了.
      

  7.   

    你好我用NewByteArray提示找不到这个函数啊,请问要加什么头文件吗?
      

  8.   


    --在jni接口的c或cpp文件中加上:#include <jni.h>
      

  9.   

    请问最后这个问题怎么解决的。关于set的时候出错哦~