1

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)

トラブルから私を助けてください。よろしくお願いします。私はこの素晴らしいサイトに慣れていないので、悪い説明をお許しください

4

1 に答える 1

0

platform.jar と jna.jar の異なるバージョンは使用できません。 それがあなたのエラーの原因です。両方とも一緒に配布されているので、一方のバージョンを別のバージョンで使用している理由がわかりません。

于 2013-03-01T13:23:17.840 に答える