java - corrupted double-linked list error 第一次运行程序时,后续运行正常

标签 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/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/

相关文章:

java - 即使字符串与 Java 匹配,compareTo 也会返回 -1

java - 当文本有条件时,在编辑文本中输入的文本在较新的 Android 版本上消失

c++ - 使用返回对象的函数处理错误

c++ - 动态转换为 void 指针有实际用途吗?

c++ - 使用 Qt 在 Mac OS 上开始开发

java - 未找到原生 UnsatisfiedLinkError 异常 Android JNI 的实现

java - 使用 Twilio sms api 从 Java Web 应用程序发送短信时出现异常

java,从父类(super class)初始化子类

Android - 使用 jni 将波形文件的 channel 从立体声更改为单声道或从单声道更改为立体声

java - 如何在 JNI 中访问从 C++ 返回 java.lang.String 的 Java 方法的返回值?