我围绕摄像头驱动程序编写了一个 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;
}
我相当确定我正在传递一个有效的数组。可能出了什么问题,最好的调试方法是什么?
最佳答案
我尝试了一种不同的返回数据的方法:不是通过作为参数传递的数组,如这个问题中所述,而是通过每次在 C++ 函数中分配一个新数组,只是为了查看第一次运行是否崩溃不断发生。它做了。尽管我会得到段错误而不是损坏的双链表。我玩了分配数组的大小。第一次打开相机后,我可以分配一个 1000 字节的数组,但不能分配 2000 字节的数组(两者都太小了)。
在尝试分配新的 jbyte 数组(替代方法)或获得对其的写访问权(这个问题)之前,我终于能够通过每次启动时打开、关闭和重新打开相机来解决这个问题,这可能据我了解 JNI 文档,仍然涉及在后台分配一个新数组。也许这是 JVM 或相机驱动程序错误,但我可以绕过它。
我想知道是否有一种方法可以通过检查 C++ 代码可用的内存量来防止这种崩溃。
关于java - corrupted double-linked list error 第一次运行程序时,后续运行正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42148495/