我被这件事难住了。我的 JNI 代码可以在 Ubuntu 11 和 MacOSX 上运行,但会导致 Windows 出现问题。
JRE 版本:6.0_31-b05 操作系统:带有 gcc 4 的 Windows XP。修改 jni_md.h 以避免 _int64 编译错误:http ://www.vtk.org/pipermail/vtkusers/2006-May/085047.html
代码是使用 Maven 构建和运行的。运行我们在 Ubuntu 11 和 MacOSX 上完美运行的单元测试时会发生错误。
几点观察。
1) 有一个函数返回字符串。这将导致单元测试冻结。这是签名。
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 环境。