gpt4 book ai didi

java - 在 64-Win 7 上的 32 位 JVM 中读取 C++ 中的 JNI-ByteBuffer 时发生访问冲突

转载 作者:太空狗 更新时间:2023-10-29 23:17:51 26 4
gpt4 key购买 nike

我正在尝试用 Java 构建一个 SIP 客户端。作为 SIP 框架,我使用 doubango。为了显示我通过 JOGL 使用 OpenGL 的视频,但这应该不重要,因为在测试期间我实际上从 JOGL 中分离了 ByteStream。

首先,该视频在 Win 7 和 32 位虚拟机上运行良好。这些库不能为 64 位编译,所以我必须在 64 位系统上使用 32 位虚拟机,我认为这应该可以正常工作。不幸的是,我只能看到视频几秒钟,然后它崩溃并显示“javaw.exe 中 0x774315de 处的未处理异常:0xC0000005:访问冲突读取位置 0xdddddde9。”

在 VisualStudio 中调试显示,异常发生在以下行:

memcpy((void*)m_ConsumeBuffer.pConsumeBufferPtr, pBuffer, nRetsize);

( http://code.google.com/p/doubango/source/browse/branches/2.0/doubango/bindings/_common/ProxyConsumer.cxx#710 )

很明显错误是在调用该方法数百次后发生的(因为视频会正确显示一段时间)。

为了缩小可能的原因,我在测试中只实现了传入视频。

doubango 从我的 Java 实现中获取指向 ByteBuffer 的指针,如下所示:

videoFrame = ByteBuffer.allocateDirect(frameSize);
consumer.setConsumeBuffer(videoFrame, frameSize);

consumer是doubango自带的ProxyVideoConsumer,我在构造的时候从中获取。

我自己不太熟悉 C++ 调试,因为我对 Java 和 Delphi 更有经验,但我认为我有信心说似乎发生了某种堆损坏。

我目前的假设是 JVM 的 ByteBuffer.allocateDirect(..)-函数在 64 位机器上运行 32 位 JVM 时不能正确运行,但我当然可以错了。

有趣的是,在大约 50 次测试运行中有两次,视频稳定了 5-10 分钟,没有任何降级或明显的内存泄漏。但这种“伪随机性”与我在 Delphi 中遇到内存分配问题的经验是一致的。

如果有人能帮助我,我会很高兴,因为我已经想不出如何让它稳定运行的想法。

问候,Csp

最佳答案

我想我自己解决了这个问题。显然,当错误发生时,pBuffer 此时已经被释放/失效。到目前为止,我跟踪了错误,JVM 以随机间隔释放包含缓冲区的 sipSession,即使 JVM 中仍有引用。

将垃圾收集器置于 Debug模式也没有透露太多信息,因为此时它没有记录任何处置任何对象的意图。实际上,错误仅在几秒钟后发生,因此 GC 并未在此时尝试释放任何内容。

我发现了一个例子,我过早地释放了 sipSession,这降低了错误的频率,但所有其他处置都有导致 GC 的堆栈跟踪。

关于java - 在 64-Win 7 上的 32 位 JVM 中读取 C++ 中的 JNI-ByteBuffer 时发生访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16233791/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com