java - Adgang krænkelse 0xc0000005 ved afslut med JNI Cygwin kode på Windows XP

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har stumped på dette. Jeg har JNI kode, der virker på Ubuntu 11 og MacOSX, men forårsager problemer med Windows.


JRE-version: 6.0\_31-b05
OS: Windows XP med gcc 4. Ændret jni\_md.h for at undgå \_int64 kompileringsfejl: http://www.vtk.org/pipermail/vtkusers/2006-May/085047.html[3]


Koden er bygget og kører ved hjælp af Maven. Fejlen sker, når vi kører vores enhedsprøve, som fungerer perfekt på Ubuntu 11 og MacOSX.


Et par observationer.


1) Der var en funktion, der returnerer String. Det ville medføre, at enhedsprøven fryser. Her er underskriften.


JNIEXPORT jstring JNICALL Java\_com\_ctrlworks\_puppet\_driver\_DefaultDriver\_Get\_1FW\_1Version(
    JNIEnv *env, jobject obj) {


2) Hvis funktionen fra at blive påberåbt og ændring af enhedsprøve derfor forårsages, at enhedsprøven løber igennem uden fejl, men forårsager adgangsbrud ved udgang.


Stack spor:


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


Din hjælp mest værdsat.
Jeg er en komplet Windows novice, og det hjælper ikke.
Jeg forsøgte at kigge på Visual C ++ 2010, men fik mange kompileringsfejl, så jeg besluttede mig bedre med Cygwin. Vi har også en masse scripting logik i BASH, så vi har alligevel brug for Cygwin-miljøet.

Bedste reference


Du vil helt sikkert ikke gerne bygge et JNI-bibliotek mod cygwin.dll. Der er ikke noget i cygwin, som du vil have i dit endelige JNI-bibliotek.


Enten bygge med MSVC, mingw, eller brug -mno-cygwin flag ved hjælp af cygwin gcc.