Java 第一次运行程序时出现损坏的双链表错误,后续运行正常

Java 第一次运行程序时出现损坏的双链表错误,后续运行正常,java,c++,java-native-interface,Java,C++,Java Native Interface,我围绕一个摄像头驱动程序编写了一个Java/JNI包装器,目前我将其用作单元测试。有一个奇怪的问题:在打开相机或打开相机电源后,我第一次运行它时,它总是出现以下错误: *** Error in `java': corrupted double-linked list: 0x00007f70014bf4c0 *** ======= Backtrace: ========= /lib/x86_64-linux-gnu/libc.so.6(+0x77725)[0x7f70084de725] /lib/

我围绕一个摄像头驱动程序编写了一个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;

}
JNIEXPORT jint JNICALL Java\u net\u---------摄像头\u pleora\u pleora摄像头\u nativeCopyRawImage
(JNIEnv*env,jobject对象,jbyterarr){
int copyLen=0;
如果(imageSizeBytes>0){
jbyte*bufferPtr=env->GetByteArrayElements(arr,NULL);//GetArrayLength(arr);
copyLen=std::min(len,imageSizeBytes);
std::memcpy(bufferPtr、imageBuffer、copyLen);
环境->释放条件(arr,bufferPtr,0);
}
返回复印机;
}

我相当确定我传递的是一个有效数组。什么是错的,什么是调试这个最好的方法?

< P>我尝试了一种不同的数据返回方法:不是通过一个数组作为一个参数传递,如在这个问题中所描述的,而是通过在C++函数中每次分配一个新数组,来看看第一次运行崩溃是否发生。是的。虽然我会得到一个分段错误,而不是一个损坏的双链接列表。我处理分配的数组的大小。在第一次打开相机后,我可以分配一个1000字节的数组,但不能分配一个2000字节的数组(两者都太小了)

在尝试分配新的jbyte阵列(替代方法)或获得对它的写访问权(这个问题)之前,我最终能够通过每次启动时打开、关闭和重新打开相机来绕过这个问题,就我所了解的JNI文档而言,这可能仍然涉及在引擎盖下分配新阵列。也许这是一个JVM或摄像头驱动程序错误,但我可以绕过它


我想知道是否有一种方法来阻止这种崩溃,通过检查可用的内存量的C++代码。< / P>我不太确定,但答案是帮助?也许你可以用它来进一步完善这个问题谢谢,我以前见过这个问题,答案似乎没有帮助。