0

JNA を使用して構造体を渡す必要があります。

私が持っているドキュメントには、次の情報があります。

int rdGetStatusHardware (struct StatusHardware *stat)

struct StatusHardware{
unsigned char   SerialNumber[12];   
unsigned long   HWVersion;
unsigned long   FWVersion;
unsigned long   MemorySize;
unsigned short  BootVersion;
unsigned short  FPGAVersion;
unsigned long   Devices;
unsigned char   Reserved[8];
};

構造を次のようにマッピングしました。

public class StatusHardware extends Structure {
    public byte SerialNumber[] = new byte[12];
    public byte HWVersion[] = new byte[4];
    public byte FWVersion[] = new byte[4];            
    public byte MemorySize[] = new byte[4];
    public byte BootVersion[] = new byte[2];
    public byte FPGAVersion[] = new byte[2];
    public byte Devices[] = new byte[4];
    public byte Reserved[] = new byte[8];
    public StatusHardware(Pointer p){
        super(p);
    }
}

これは私のインターフェースのメソッドです:

int rdGetStatusHardware(Pointer p);

ライブラリの呼び出し:

Pointer ptr = new Memory(40);
int result = CLibrary.INSTANCE.rdGetStatusHardware(ptr);

このアプローチでは、次のエラーが発生します。

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00000000, pid=3108, tid=5492
#
# JRE version: 6.0_24-b50
# Java VM: Java HotSpot(TM) Client VM (19.1-b02 mixed mode windows-x86 )
# Problematic frame:
# C  0x00000000

インターネットで見つけた他の方法を試しました...同じ結果とエラーが発生しました。

構造またはインターフェースに問題がありますか?

4

1 に答える 1

0

私の知る限り、この場合、JNAは構造体への参照を渡すことができるため、メソッドは次のようになります。

int rdGetStatusHardware(StatusHardware p);
...
StatusHardware ptr = new StatusHardware();
int result = CLibrary.INSTANCE.rdGetStatusHardware(ptr);

編集

long を固定サイズのバイト配列にマッピングしているため、アクセス違反が発生する可能性があります。long のサイズはプラットフォームによって異なる場合があるため、常に NativeLong を使用する必要があります。

public class StatusHardware extends Structure {
    public byte SerialNumber[] = new byte[12];
    public NativeLong HWVersion;
    public NativeLong FWVersion;            
    public NativeLong MemorySize;
    public short BootVersion;
    public short FPGAVersion;
    public NativeLong Devices;
    public byte Reserved[] = new byte[8];
}
于 2012-09-03T17:51:29.893 に答える