2013-04-30 88 views
0

我想從我創建的JNA界面調用system32CreateProcessW。問題是,當我從32位JRE運行軟件時,它工作正常,但當我轉移到64位JRE時,它會使JVM崩潰。JNA調用與32位JRE但不與64位JRE

Kernel32 kernel = (Kernel32) Native.loadLibrary("kernel32", 
     Kernel32.class, new HashMap<String, Object>() { 
      private static final long serialVersionUID = 1L; 

      { 
       put(Library.OPTION_FUNCTION_MAPPER, 
         W32APIFunctionMapper.UNICODE); 
       put(Library.OPTION_TYPE_MAPPER, 
         W32APITypeMapper.UNICODE); 
      } 
     }); 

ProcessInformation processInformation = new ProcessInformation(); 
byte[] startupInfo = new byte[67]; 

int num2 = BitConverter.toInt32(bytes, 60); 
int num = BitConverter.toInt16(bytes, num2 + 6); 
IntByReference ptr4 = new IntByReference(BitConverter.toInt32(bytes, num2 + 0x54)); 
kernel.CreateProcessW(surrogateProcess, null, 0, 0, false, 4, 0, 
      null, startupInfo, processInformation); 

的Kernel32 JNA接口:

public interface Kernel32 extends StdCallLibrary { 

    boolean CreateProcessW(String appName, String commandLine, int procAttr, 
     int thrAttr, boolean inherit, int creation, int env, String curDir, 
     byte[] sInfo, ProcessInformation pInfo); 

} 

PROCESSINFORMATION JNA結構:

public final class ProcessInformation extends Structure implements ByReference { 

    public IntByReference hProcess; 
    public IntByReference hThread; 
    public int dwProcessId; 
    public int dwThreadId; 

    @Override 
    protected List<String> getFieldOrder() { 
     return Arrays 
       .asList("hProcess", "hThread", "dwProcessId", "dwThreadId"); 
    } 

} 

最後,這裏是當我在64上運行時出現的錯誤bit JRE:

# 
# A fatal error has been detected by the Java Runtime Environment: 
# 
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0000000077a4e711, pid=1888, tid=8968 
# 
# JRE version: 6.0_43-b01 
# Java VM: Java HotSpot(TM) 64-Bit Server VM (20.14-b01 mixed mode windows-amd64 compressed oops) 
# Problematic frame: 
# C [ntdll.dll+0x4e711] 
# 
# An error report file with more information is saved as: 
# C:\Users\Thomas\workspace\trident\hs_err_pid1888.log 
# 
# If you would like to submit a bug report, please visit: 
# http://java.sun.com/webapps/bugreport/crash.jsp 
# The crash happened outside the Java Virtual Machine in native code. 
# See problematic frame for where to report the bug. 
# 

回答

2

您的CreateProcess映射是僞造的。你從哪裏得到了可以使用Java int來表示指針值的想法?哦,沒關係,win32 API肯定教會了你。

必須使用PointerPointerType或等效表示指針,或者如果你真的卡住使用整數值,至少在64位平臺上使用long(64位)。

順便說一句,JNA包括一個platform.jar,其中包括kernel32映射,其中包括CreateProcess