2017-02-09 9 views
3

Я написал обертку Java/JNI вокруг драйвера камеры, которую я сейчас использую в качестве модульного теста. Там странная проблема: первый раз, когда я запустить его после включения питания или велосипедной камеры, она всегда имеет следующую ошибку:Поврежденная ошибка с двойной связью при запуске программы в первый раз, последующие прогоны в порядке

*** Error in `java': corrupted double-linked list: 0x00007f70014bf4c0 *** 
======= Backtrace: ========= 
/lib/x86_64-linux-gnu/libc.so.6(+0x77725)[0x7f70084de725] 
/lib/x86_64-linux-gnu/libc.so.6(+0x7daa4)[0x7f70084e4aa4] 
/lib/x86_64-linux-gnu/libc.so.6(+0x82175)[0x7f70084e9175] 
/lib/x86_64-linux-gnu/libc.so.6(__libc_malloc+0x54)[0x7f70084ea5a4] 
/usr/lib/jvm/java-8-oracle/jre/lib/amd64/server/libjvm.so(+0x91bbd5)  [0x7f7007d92bd5] 
/usr/lib/jvm/java-8-oracle/jre/lib/amd64/server/libjvm.so(+0x6deab8)[0x7f7007b55ab8] 
/home/ceres/git/CameraTest/build/libPleoraWrapper.so(_ZN7JNIEnv_20GetByteArrayElementsEP11_jbyteArrayPh+0x33) [0x7f6feddfc4e7] 
/home/ceres/git/CameraTest/build/libPleoraWrapper.so(Java_net_ceresimaging_camera_pleora_PleoraCamera_nativeCopyRawImage+0x53)[0x7f6feddfbcf4] 
[0x7f6ff1017494] 

В следующий раз, и все последующие раз он работает нормально. Это мой код на C++:

JNIEXPORT jint JNICALL Java_net_---------_camera_pleora_PleoraCamera_nativeCopyRawImage 
    (JNIEnv * env, jobject obj, jbyteArray arr) { 

    int copyLen = 0; 

    if (imageSizeBytes>0){ 

     jbyte* bufferPtr = env->GetByteArrayElements(arr, NULL);//<-- the error seems to be happening here 

     jsize len = env->GetArrayLength(arr); 

     copyLen = std::min(len,imageSizeBytes); 

     std::memcpy(bufferPtr, imageBuffer, copyLen); 

     env->ReleaseByteArrayElements(arr,bufferPtr,0); 


    } 

    return copyLen; 

} 

Я уверен, что передаю действительный массив. Что может быть неправильным и как лучше всего отладить это?

+0

Я не совсем уверен, но ответы на [этот вопрос] (https://stackoverflow.com/questions/14897157/what-does-corrupted-double-linked-list-mean) помогают? Возможно, вы можете использовать его для уточнения вопроса. –

+0

Спасибо, я уже видел этот вопрос, ответы, похоже, не помогают. – infrared

ответ

1

Я попробовал другой способ возврата данных: не через массив, который передан как аргумент, как описано в этом вопросе, а путем выделения нового массива каждый раз в функции C++, просто чтобы увидеть, происходит крах. Так оно и было. хотя я бы получил ошибку сегментации вместо поврежденного двойного списка. Я играл с размером выделенного массива. После первого открытия камеры я смог выделить 1000-байтовый массив, но не 2000-байтовый (оба они были бы слишком малы).

Я, наконец, смог решить проблему, открывая, закрывая и снова открывая камеру при запуске, прежде чем пытаться выделить новый массив jbyte (альтернативный метод) или получить доступ к нему на запись (этот вопрос), который возможно, все еще связано с распределением нового массива под капотом, насколько я понимаю документацию JNI. Возможно, это ошибка JVM или драйвера камеры, но я могу обойти ее.

Интересно, существует ли способ предотвратить подобный сбой, проверяя объем памяти, доступный для кода на C++.