在Windows XP上使用JNI Cygwin代码退出时访问冲突0xc0000005

时间:2012-03-20 12:48:59

标签: java windows java-native-interface cygwin gcc4

我很难过。我有适用于Ubuntu 11和MacOSX的JNI代码,但会导致Windows出现问题。

JRE版本:6.0_31-b05 操作系统:带有gcc的Windows XP 4.修改了jni_md.h以避免_int64编译错误:http://www.vtk.org/pipermail/vtkusers/2006-May/085047.html

代码是使用Maven构建和运行的。运行我们在Ubuntu 11和MacOSX上完美运行的单元测试时会发生错误。

一些观察结果。

1)有一个函数返回String。这会导致单元测试冻结。这是签名。

JNIEXPORT jstring JNICALL Java_com_ctrlworks_puppet_driver_DefaultDriver_Get_1FW_1Version(
    JNIEnv *env, jobject obj) {

2)从调用函数中取出函数并相应地修改单元测试会导致单元测试无错误地运行,但会在退出时导致访问冲突。

堆栈追踪:

Current thread (0x02c1ac00):  VMThread [stack: 0x02d00000,0x02d50000] [id=3360]

siginfo: ExceptionCode=0xc0000005, reading address 0x02d4de30

Registers:
EAX=0x02d4ce64, EBX=0x001b2b28, ECX=0x00000001, EDX=0x00000001
ESP=0x02d4fc14, EBP=0x02d4fc5c, ESI=0x02d4fc70, EDI=0x00000000
EIP=0x6102879e, EFLAGS=0x00010212

EAX=
[error occurred during error reporting (printing register info), id 0xc0000005]

Stack: [0x02d00000,0x02d50000],  sp=0x02d4fc14,  free space=319k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C  [cygwin1.dll+0x2879e]  dll_noncygwin_dllcrt0+0x1e
C  [ntdll.dll+0x118a]  LdrInitializeThunk+0x24
C  [ntdll.dll+0x23aba]  RtlDestroyEnvironment+0x178
C  [kernel32.dll+0x1ca96]  IsValidLocale+0x8eb
C  [kernel32.dll+0x1cb0e]  ExitProcess+0x14
C  [msvcr71.dll+0x8d04]  exit+0x0
C  [msvcr71.dll+0x8d11]  exit+0xd
V  [jvm.dll+0x11d88d]
V  [jvm.dll+0x11cb9e]
V  [jvm.dll+0x11cec2]
V  [jvm.dll+0x11d2d2]
V  [jvm.dll+0x140ffc]
C  [msvcr71.dll+0x9565]  endthreadex+0xa0
C  [kernel32.dll+0xb713]  GetModuleFileNameA+0x1b4

VM_Operation (0x009efb80): Exit, mode: safepoint, requested by thread 0x003b7000

非常感谢您的帮助。 我是一个完整的Windows新手,但没有帮助。 我试着研究Visual C ++ 2010,但是遇到了很多编译错误,所以决定我最好使用Cygwin。我们在BASH中也有相当多的脚本逻辑,所以无论如何我们都需要Cygwin环境。

1 个答案:

答案 0 :(得分:2)

你绝对想要针对cygwin.dll构建一个JNI库。在最终的JNI库中,你不想要cygwin中的任何内容。

使用MSVC构建,mingw,或使用cygwin gcc使用-mno-cygwin标志。