gpt4 book ai didi

java - 在 Linux 上调用 JNI 代码时奇怪的崩溃;我是否正确编译了我的共享库?

转载 作者:太空狗 更新时间:2023-10-29 11:19:51 25 4
gpt4 key购买 nike

这似乎只发生在使用 Java 1.7 时,无论是 Oracle 还是 OpenJDK JRE。使用 Java 1.6(Oracle 和 OpenJDK)时一切正常。

前一段时间,我尝试在 Linux 下编译 JNI 共享库(用于 Java 电影播放器​​的 LibVLC 包装器)。然而,当调用某些 native 函数时,JVM 偶尔会崩溃,错误日志引用 libc.so 中的函数 _IO_file_underflow 作为有问题的框架。

最终我发现我只是在编译时遗漏了一些 GCcflags,这些问题可能是由某些优化或 JVM 没有预料到的引起的。关注this guide后以及 this question 的答案我在编译命令中添加了一些标志,例如 -fno-strict-aliasing-pthread,一切正常。

至少,这在 OpenSuSe 12.1 和 OpenJDK 1.6 下有效。不幸的是,在升级到 OpenSuse 12.2 和 OpenJDK 1.7 之后,应用程序再次开始崩溃,并显示以下熟悉的错误消息:

#
[thread -1984603328 also had an error]# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0xb770ff38, pid=19354, tid=2309835584
#
# JRE version: 7.0_09-b30
# Java VM: OpenJDK Client VM (23.2-b09 mixed mode linux-x86 )
# Problematic frame:
# C [libc.so.6+0x127f38] _IO_file_underflow+0x68
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# An error report file with more information is saved as:
# /usr/fids/build_vlcplayer/hs_err_pid19354.log

#
# If you would like to submit a bug report, please include
# instructions on how to reproduce the bug and visit:
# http://icedtea.classpath.org/bugzilla
#

我正在使用以下命令进行编译(许多标志可能是多余的):

gcc -I/usr/lib/jvm/java-1.7.0-openjdk-1.7.0/include/ -I/usr/lib/jvm/java-1.7.0-openjdk-1.7.0/include/linux/ -fno-strict-aliasing -fno-omit-frame-pointer -fPIC -pthread -static-libgcc -D_REENTRANT -Di586 -DARCH='"I586"' -DLINUX -D_LARGEFILE64_SOURCE -D_GNU_SOURCE -D_LITTLE_ENDIAN  -Wall -Wno-unused-parameter -DDEBUG_MODE -shared -lvlc -lc -lX11 movieplayer.c -Wl,-soname,movieplayer.so -o movieplayer.so

我在 GCC 3.3 版和 4.7 版上都试过了。

由于相同的代码在 Windows(使用 Oracle JDK 1.6 或 1.7)或 OpenSuSe 12.1(使用 OpenJDK 1.6)下运行良好,我认为 movieplayer.c 的实际源代码不相关;尽管如此,这是发生崩溃的部分:

/** The LibVLC instance.*/
static libvlc_instance_t * vlcInstance = NULL;

/** The media object representing the video. */
static libvlc_media_t * media = NULL;

/** The media player. */
static libvlc_media_player_t * mediaPlayer = NULL;

...

const char * fname = str + 1;

DEBUGMSG("Opening file: '%s'\n", fname);

// Create a VLC media object for this file.
media = libvlc_media_new_path (vlcInstance, fname);

if(media)
{
// Parse the media. This allows fetching duration and track info.
DEBUGMSG("Parsing media.");
libvlc_media_parse(media); // <-- Crash occurs at this point.

// Create the media player.
DEBUGMSG("Creating a media player.");
mediaPlayer = libvlc_media_player_new_from_media(media);

...
}

...

当我修改此代码时,在调用其他 LibVLC 函数或在一种情况下调用 POSIX sleep 函数时的不同时刻会发生相同的崩溃。

基本上我的问题是:我是否正确地认为这些崩溃是因为我没有正确编译应用程序而引起的?如果是这样,我做错了什么?

最佳答案

下面是关于同一问题的讨论: https://github.com/caprica/vlcj/issues/62解决方法:在 VLC 中禁用 LUA。 Ubuntu 包装以某种方式破坏了它。也有对进一步讨论它的页面的引用。另见 https://bugs.launchpad.net/ubuntu/+source/lua5.1/+bug/1136432 .

关于java - 在 Linux 上调用 JNI 代码时奇怪的崩溃;我是否正确编译了我的共享库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13821854/

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