我正在使用swig从c ++生成java代码。 c ++代码抛出异常。它们在Windows上被捕获,包括32位和64位代码。它在Solaris上也适用于32位。但是在64位Solaris上,任何来自c ++代码的异常都不会在Java程序中捕获。
这是java生成的调用堆栈的相关部分。这里CheckThrowError是c ++库中抛出异常的函数。
tack: [0xfffffd7ffd34f000,0xfffffd7ffd44f000], sp=0xfffffd7ffd44e4f8, free space=1021k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C 0x00000000000ad7c5
C [libc.so.1+0xe18a9] _Unwind_RaiseException+0x46
C [libstdc++.so.6.0.3+0xdc74e] __cxa_throw+0x5e
C [libcsclientswig.so+0x552e9] CheckThrowError(ATLAS::blob_status)+0x37
我正在使用gcc 3.4.3。这里CheckThrowError是库中抛出异常的函数。
我非常感谢您尝试解决此问题的任何指导。
答案 0 :(得分:0)
我找到了这个问题,以防其他人遇到它。本质上,Java使用的Solaric C运行时与用于构建c ++库的GCC运行时之间的异常处理不同,导致无法捕获异常。修复它的hack涉及强制首先加载GCC运行时,从而导致正确的异常处理。我是使用LD_PRELOAD环境变量完成的。
export LD_PRELOAD=/usr/sfw/lib/amd64/libgcc_s.so
在此之后,Java代码能够处理源自c ++的异常。为什么这不是32位的问题,我不知道。