JNI Android jbytearray到unsigned char *和反之亦然

时间:2014-08-12 08:01:27

标签: android c++ android-ndk java-native-interface bytearray

我有2个单独的pthread和一个静态struct数组。其中一个pthread写入解码对象,包括字节,大小,宽度和高度。另一个pthread实际上正在读取堆栈并进行一些图像处理并将结果发布到java函数。

这是问题,在pthread1上我将jbytearray转换为unsigned char *,并存储到静态数组上的位置0。

但是当pthread2将其转换回jbytearray时会发生一些事情,而且我总是会发出致命的信号。

这是我的cpp类的顶部

struct DecodeObject {

unsigned char* data;
int data_size;
int width;
int height;
int orientation;

};

static int decodeLimit = 200 ;
static DecodeObject decodeList[200] ;
static int decodeSize = -1 ;

这是我的pthread1

的一部分
        //Values
        jbyteArray imageData = (jbyteArray) env->CallObjectMethod(decodeObject,getData);
        jint width = (jint) env->CallIntMethod(decodeObject,getWidth);
        jint height = (jint) env->CallIntMethod(decodeObject,getHeight);
        jint orientation = (jint) env->CallIntMethod(decodeObject,getOrientation);

        if(decodeSize<decodeLimit-1){

            DecodeObject object;
            object.data_size =   env->GetArrayLength (imageData);
            object.data = as_unsigned_char_array(env,imageData);
            object.width = width;
            object.height = height;
            object.orientation = orientation;

            decodeSize++;
            decodeList[decodeSize] = object;

        }
        else {
            LOGD("ERROR => BUFFER IS FULL");
        }

这是我的pthread2的一部分

        //PREPARE  RUNS OK
        LOGD("PREPARE"); // RUNS OK
        tempObject.data =  Prepare(tempObject.data,tempObject.width,tempObject.height);

        LOGD("CONVERT BACK TO JBYTEARRAY"); //HERE FAILS
        jbyteArray converted = as_byte_array(env,tempObject.data,tempObject.data_size);

        LOGD("DONE CONVERTING");

最后这是我用来转换的功能

unsigned char* as_unsigned_char_array(JNIEnv* &env,jbyteArray array) {
    int len = env->GetArrayLength (array);
    unsigned char* buf = new unsigned char[len];
    env->GetByteArrayRegion (array, 0, len, reinterpret_cast<jbyte*>(buf));
    return buf;
}

jbyteArray as_byte_array(JNIEnv* &env,unsigned char* buf, jsize len) {

    jbyteArray array = env->NewByteArray(len);

    //HERE I GET THE ERROR, I HAVE BEEN TRYING WITH len/2 and WORKS , PROBABLY SOME BYTS ARE GETTING LOST.
    env->SetByteArrayRegion (array, 0, len, (jbyte*)(buf));

    return array;
}

0 个答案:

没有答案