Java 在Windows XP上使用JNI Cygwin代码退出时访问冲突0xc0000005
这件事难倒我了。我有在Ubuntu11和MacOSX上运行的JNI代码,但会导致Windows出现问题 JRE版本:6.0_31-b05 OS:WindowsXP和GCC4。修改jni_md.h以避免_int64编译错误: 代码是使用Maven构建和运行的。错误发生在运行我们的单元测试时,该测试在Ubuntu11和MacOSX上完美运行 一些观察 1) 有一个函数返回字符串。这将导致单元测试冻结。这是签名Java 在Windows XP上使用JNI Cygwin代码退出时访问冲突0xc0000005,java,windows,java-native-interface,cygwin,gcc4,Java,Windows,Java Native Interface,Cygwin,Gcc4,这件事难倒我了。我有在Ubuntu11和MacOSX上运行的JNI代码,但会导致Windows出现问题 JRE版本:6.0_31-b05 OS:WindowsXP和GCC4。修改jni_md.h以避免_int64编译错误: 代码是使用Maven构建和运行的。错误发生在运行我们的单元测试时,该测试在Ubuntu11和MacOSX上完美运行 一些观察 1) 有一个函数返回字符串。这将导致单元测试冻结。这是签名 JNIEXPORT jstring JNICALL Java_com_ctrlworks_
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环境。您肯定不想针对Cygwin.dll构建JNI库。cygwin中没有任何东西是您最终的JNI库所需要的
使用MSVC、mingw构建,或者使用cygwingcc使用-mno-cygwin标志 不要修改jni_md.h。定义CPP宏以修复错误(例如#define uu int64 long long)。您需要提供更多详细信息,包括您的C代码实际在做什么,或者至少是您正在调用的操作的概述。您是否考虑过避免使用每平台JNI层而改用JNA()?这将降低您必须执行的特定于平台的编码级别。感谢您的评论。我确实将int64定义为long-long。该代码旨在通过POSIX termios使用USB串行端口驱动微控制器。这部分代码可能还需要一些更改,但我至少希望确保JNI部分正常工作。我不熟悉JNA,所以从来没有考虑过。如果是这样的话,我就必须考虑它,或者是java USB接口。我们正处于时间紧迫的情况下,如果有必要,我们不想创建任何新代码。