大家好:
请问下, 我想把 java层的 byte[]的二进制数据,传递到native层使用,然后解码后再 memcpy到surface中。
1,转换如下:
jint Java_com_testJni_setData(JNIEnv* env, jobject thiz, jbyteArray in, jint length)
{
    char* data = NULL;
    if (NULL != in) {
        if (0 < length) {
          void *data = malloc(length);
          (*env)->GetByteArrayRegion(env,in, (jint)0, length, (jbyte *) data);
          ............////这里把数据投递到一个C代码的一个内存池里
           
        }
     }
  return 0;
}
2,可是这样我感觉没有什么问题,可是当有数据传递过来时, native层的把解码后的数据传递到surface的时候就出现
08-01 11:33:54.685: A/libc(11713): Fatal signal 11 (SIGSEGV) at 0x4ce6d000 (code=1)其问下为什么???
3,如果不把数据传递到上层,则没有这个错误提醒!!!请教下大牛,这个是为什么,谢谢!

解决方案 »

  1.   

    char* uc = (char*) (*env)->GetByteArrayElements(env, ucData, 0);
    我是直接这样写的.jbyteArray ucData
      

  2.   

    char* data = NULL;
    void *data = malloc(length);
    这样是否定义了两个data呢?
      

  3.   

    你这样写有问题不对吧
    我是这样写的:unsigned char *byteArrayToByte(JNIEnv* env, jbyteArray byteArray) {
    jbyte *pjb = (jbyte *) (*env)->GetByteArrayElements(env, byteArray, 0);
    jsize jlen = (*env)->GetArrayLength(env, byteArray);
    INT len = (INT) jlen;
    UINT8 *byBuf = NULL; if (len > 0) {
    byBuf = (char*) malloc(len + 1);
    memcpy(byBuf, pjb, len);
    byBuf[len] = '\0';
    }
    else {
    byBuf = (char*) malloc(1);
    byBuf[0] = '\0';
    } (*env)->ReleaseByteArrayElements(env, byteArray, pjb, 0);
    return byBuf;
    }
      

  4.   

    哦,谢谢doveqian, 问下 明明 传过来的是一块数据,里面是二进制的数据, 你为什么要在后面增加一个'\0'呢,谢谢!这样增加后,岂不是多了一个字节的数据, 我传递的是二进制数据,不是string。