2013-02-27 116 views
1

使用jna读取windows日志时出现异常

以下是我正在使用的程序来读取日志。我从另一篇文章中看到了这个程序。使用jna读取windows日志

import java.io.IOException; 
import java.nio.ByteBuffer; 
import java.nio.CharBuffer; 
import java.util.Arrays; 

import com.sun.jna.*; 
import com.sun.jna.platform.win32.*; 
import com.sun.jna.platform.win32.WinNT.*; 
import com.sun.jna.ptr.IntByReference; 

public class Test { 

public static void main(String[] args) throws NumberFormatException, IOException { 

    HANDLE h = com.sun.jna.platform.win32.Advapi32.INSTANCE.OpenEventLog(null, "Application"); 
    IntByReference pnBytesRead = new IntByReference(); 
    IntByReference pnMinNumberOfBytesNeeded = new IntByReference(); 

    IntByReference pOldestRecord = new IntByReference(); 
    assertTrue(com.sun.jna.platform.win32.Advapi32.INSTANCE.GetOldestEventLogRecord(h, pOldestRecord)); 
    int dwRecord = pOldestRecord.getValue(); 
    System.out.println("OLD: " + dwRecord); 
    IntByReference pRecordCount = new IntByReference(); 
    assertTrue(com.sun.jna.platform.win32.Advapi32.INSTANCE.GetNumberOfEventLogRecords(h, pRecordCount)); 
    int dwRecordCnt = pRecordCount.getValue(); 
    System.out.println("CNT: " + dwRecordCnt); 

    int bufSize = 0x7ffff; //(r.size()) * 2048; 
    Memory buffer = new Memory(bufSize); 
    int rc = 0; 
    int cnt = 0; 
    while(com.sun.jna.platform.win32.Advapi32.INSTANCE.ReadEventLog(h, 
      WinNT.EVENTLOG_SEEK_READ /* 
      | WinNT.EVENTLOG_SEQUENTIAL_READ */ 
      | WinNT.EVENTLOG_FORWARDS_READ /* 
      | WinNT.EVENTLOG_BACKWARDS_READ*/ 
      , 
      dwRecord, buffer, 
      bufSize, 
      pnBytesRead, 
      pnMinNumberOfBytesNeeded)) { 

     rc = Kernel32.INSTANCE.GetLastError(); 
     if (rc == W32Errors.ERROR_INSUFFICIENT_BUFFER) { 
      break; 
     }   

     int dwRead = pnBytesRead.getValue(); 
     Pointer pevlr = buffer; 

     while (dwRead > 0) 
     { 
      cnt++; 
      EVENTLOGRECORD record = new EVENTLOGRECORD(pevlr); 
      System.out.println("------------------------------------------------------------"); 
      System.out.println(cnt+". " + dwRecord + " Event ID: " + record.EventID.shortValue() + " SID: " + record.UserSidLength); 

      dwRecord++; 

      // WCHAR SourceName[] 
      // WCHAR Computername[] 
      { 
       ByteBuffer names = pevlr.getByteBuffer(record.size(), 
         (record.UserSidLength.intValue() != 0 ? record.UserSidOffset.intValue() : record.StringOffset.intValue()) - record.size()); 
       names.position(0); 
       CharBuffer namesBuf = names.asCharBuffer(); 
       String[] splits = namesBuf.toString().split("\0"); 
       System.out.println("SOURCE NAME: \n" + splits[0]); 
       System.out.println("COMPUTER NAME: \n" + splits[1]); 
      } 
      // SID UserSid 
      if (record.UserSidLength.intValue() != 0){ 
       ByteBuffer sid = pevlr.getByteBuffer(record.UserSidOffset.intValue(), record.UserSidLength.intValue()); 
       sid.position(0); 
       //CharBuffer sidBuf = sid.asCharBuffer(); 
       byte[] dst = new byte[record.UserSidLength.intValue()]; 
       sid.get(dst); 
       System.out.println("SID: \n" + Arrays.toString(dst)); 
      } 
      else { 
       System.out.println("SID: \nN/A"); 
      } 
      // WCHAR Strings[] 
      { 
       ByteBuffer strings = pevlr.getByteBuffer(record.StringOffset.intValue(), record.DataOffset.intValue() - record.StringOffset.intValue()); 
       strings.position(0); 
       CharBuffer stringsBuf = strings.asCharBuffer(); 
       System.out.println("STRINGS["+record.NumStrings.intValue()+"]: \n" + stringsBuf.toString()); 
      } 
      // BYTE Data[] 
      { 
       ByteBuffer data = pevlr.getByteBuffer(record.DataOffset.intValue(), record.DataLength.intValue()); 
       data.position(0); 
       CharBuffer dataBuf = data.asCharBuffer(); 
       System.out.println("DATA: \n" + dataBuf.toString()); 
      } 
      // CHAR Pad[] 
      // DWORD Length; 

      dwRead -= record.Length.intValue(); 
      pevlr = pevlr.share(record.Length.intValue()); 
     } 
    } 
    assertTrue(rc == W32Errors.ERROR_HANDLE_EOF); 
    assertTrue(com.sun.jna.platform.win32.Advapi32.INSTANCE.CloseEventLog(h));   
} 


private static void assertTrue(boolean getOldestEventLogRecord) { 

} 

}

例外如下: -

Exception in thread "main" java.lang.NoSuchMethodError: com.sun.jna.IntegerType. 
    <init>(IJZ)V 
    at com.sun.jna.platform.win32.WinDef$DWORD.<init>(WinDef.java:57) 
    at com.sun.jna.platform.win32.WinDef$DWORD.<init>(WinDef.java:53) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 

    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 

    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
    at java.lang.reflect.Constructor.newInstance(Unknown Source) 
    at java.lang.Class.newInstance0(Unknown Source) 
    at java.lang.Class.newInstance(Unknown Source) 
    at com.sun.jna.NativeMappedConverter.defaultValue(NativeMappedConverter.java:47) 
    at com.sun.jna.NativeMappedConverter.<init>(NativeMappedConverter.java:41) 
    at com.sun.jna.NativeMappedConverter.getInstance(NativeMappedConverter.java:29) 
    at com.sun.jna.Structure.calculateSize(Structure.java:803) 
    at com.sun.jna.Structure.useMemory(Structure.java:254) 
    at com.sun.jna.Structure.useMemory(Structure.java:238) 
    at com.sun.jna.Structure.<init>(Structure.java:174) 
    at com.sun.jna.Structure.<init>(Structure.java:167) 
    at com.sun.jna.Structure.<init>(Structure.java:163) 
    at com.sun.jna.platform.win32.WinNT$EVENTLOGRECORD.<init>(WinNT.java:1789) 
    at Test.main(Test.java:54) 

请帮我出的麻烦。提前致谢。我是这个伟大的网站的新手,所以请原谅我的错误解释

+0

您的代码,jna.jar和/或platform.jar之间的版本不匹配。 – technomage 2013-02-27 16:14:13

+0

感谢您的回复,您能否告诉我我应该使用哪个版本。我被困了五天,试图解决它,但尚未成功 – 2013-02-28 05:59:12

+0

3.5.1可以从[maven仓库]获得(https://maven.java.net/content/repositories/releases/net/java/dev /jna/jna/3.5.1/)。如果您使用NetBeans或其他包含不同版本的JNA的应用程序,则应该[使用该版本](http://aboulton.blogspot.com/2012/07/netbeans-and-java-native-access。 html),或者构建并运行独立程序。 – technomage 2013-02-28 12:27:12

回答

0

您不能使用不同版本的platform.jar和jna.jar。 是什么导致你的错误。两者都分布在一起,所以我不明白你为什么要使用另一个版本的另一个版本。