次のウィンドウのキャプチャを作成する試みを再現しようとしました: Java - Window Image (2年前の投稿)
私は JNA 3.5.0 を使用しており、XP および 7 で変更されていないコードを jre 7 でテストしましたが、どちらも同じトレースで失敗しました:
Exception in thread "main" java.lang.AbstractMethodError:
com.sun.jna.Structure.getFieldOrder()Ljava/util/List;
at com.sun.jna.Structure.fieldOrder(Structure.java:831)
at com.sun.jna.Structure.getFields(Structure.java:857)
at com.sun.jna.Structure.deriveLayout(Structure.java:983)
at com.sun.jna.Structure.calculateSize(Structure.java:908)
at com.sun.jna.Structure.calculateSize(Structure.java:896)
at com.sun.jna.Structure.allocateMemory(Structure.java:357)
at com.sun.jna.Structure.<init>(Structure.java:191)
at com.sun.jna.Structure.<init>(Structure.java:180)
at com.sun.jna.Structure.<init>(Structure.java:167)
at com.sun.jna.Structure.<init>(Structure.java:159)
at com.sun.jna.platform.win32.WinDef$RECT.<init>(WinDef.java:320)
at Paint.capture(Paint.java:24)
at Paint.<init>(Paint.java:71)
at Paint.main(Paint.java:64)
それを再現するには、単に実行するだけです:
import com.sun.jna.platform.win32.WinDef.RECT;
public class Test {
public static void main(String[] args) {
RECT rect = new RECT();
}
}
JNA を正しく理解していれば、com.sun.jna.platform.win32.WinDef はデフォルトでシステム DLL にマップされているはずです。
マッピングが正しく行われていないようです。
WinDef を必要な dll にマップする方法を見つけようとしましたが、com.sun.jna.Native.loadLibrary メソッドでこれを行う方法を見つけることができませんでした。
UnsatisfiedLinkError の代わりに AbstractMethodError がスローされる理由がわかりません。そのため、ライブラリの読み込みが本当に問題なのかわかりません。
com.sun.jna.Structure をインスタンス化すると例外が発生します。バグは、ネイティブ ライブラリのロードによって修正できるかどうか、または別の原因を持つバグであるかどうかに関する情報が見つかりませんでした。
アプリケーションが取得していないのは、Windows の権限 (管理者) ではないかと考えました。
または、jna へのいくつかのパスを明示的に正確に指定して、dll を見つける必要があるかもしれません (ただし、前に述べたように、これは UnsatisfiedLinkError ではないため、そうすべきではありません)。
JNA の経験があり、アドバイスをいただける場合は、お答えください。
スタックトレース、これまでに取得した JNA ライブラリの理解、何時間もの検索、および Javadoc の探索を考えると、JNA の平均的なユーザーがおそらく見つけられるものを明らかに見逃していました (元の投稿は「実用的な例」の資格があります)。
ところで、jna に関するリンクやリソースがあれば (あまり見つかりませんでした)、投稿してください :)
前もって感謝します !