-1

JNAを使用してdll関数を実行しています:

その方法に対応するすべてのコードは次のとおりです。

ネイティブ宣言:

//how the method declared

H264_Login (char *sIP, unsigned short wPort, char *sUserName, char *sPassword, LP_DEVICEINFO lpDeviceInfo, int *error, ,SocketStyle socketTyle=TCPSOCKET); // where LP_DEVICEINFO is a struct

//how the struct declared
typedef struct _H264_DVR_DEVICEINFO
{
    SDK_SYSTEM_TIME tmBuildTime; // the "SDK_SYSTEM_TIME" is another struct
    char sSerialNumber[64];      
    int byChanNum;          
    unsigned int uiDeviceRunTime;  
    SDK_DeviceType deviceTye; // the "SDK_DeviceType" is a enum
}H264_DVR_DEVICEINFO,*LP_DEVICEINFO;

// this is how "SDK_SYSTEM_TIME" is defined
typedef struct SDK_SYSTEM_TIME{
    int  year;  
    int  month;  
    int  day;  
}SDK_SYSTEM_TIME;

// this is how "SDK_DeviceType" is defined
enum SDK_DeviceType
{
    SDK_DEVICE_TYPE_DVR,
    SDK_DEVICE_TYPE_MVR,
    SDK_DEVICE_TYPE_NR
};

// this is how "SocketStyle" is defined
enum SocketStyle
{
    TCPSOCKET=0,
    UDPSOCKET,
    SOCKETNR
};

以下は、対応する Java マッピングです。

public class Test implements StdCallLibrary {
public interface simpleDLL extends StdCallLibrary {

 long H264_Login(String sIP, short wPort, String sUserName, String sPassword,
 Structure DeviceDate, int error, int TCPSOCKET);
}
static
{
   System.loadLibrary("NetSdk");
}

// the struct implementation
    public static class DeviceDate extends Structure{

        public SDK_SYSTEM_TIME tmBuildTime;
        public String sSerialNumber;      
        public IntByReference byChanNum;              
        public IntByReference uiDeviceRunTime;  
        public IntByReference deviceTpye;    
        @Override
        protected List<Object> getFieldOrder() {
            List<Object> list = new ArrayList<>();
            list.add("tmBuildTime");
            list.add("sSerialNumber");
            list.add("byChanNum");
            list.add("uiDeviceRunTime");
            list.add("deviceTpye");
            return list;
        }    
    }

    public static class SDK_SYSTEM_TIME extends Structure{
        public IntByReference year;  
        public IntByReference month;  
        public IntByReference day;
        @Override
        protected List<Object> getFieldOrder() {
            List<Object> list = new ArrayList<>();
            list.add("year");
            list.add("month");
            list.add("day");
            return list;
        }
    }

// and then how I called it through the main function
public static void main(String args[]) throws FileNotFoundException{

 simpleDLL INSTANCE = (simpleDLL) Native.loadLibrary( ("NetSdk"), simpleDLL.class);
 DeviceDate dev = new DeviceDate() // where DeviceDate is a static class inherits com.sun.jna.Structure
 int err = (int) INSTANCE.H264_GetLastError();

 long result = INSTANCE.H264_Login("255.255.255.255", (short) 33333, "admin", "admin", dev, err, 0);

}
}

アプリを実行すると、Java がクラッシュします。

ここに画像の説明を入力

そして、これは完全な問題の署名です:

問題の署名:
問題イベント名: APPCRASH
アプリケーション名: javaw.exe
アプリケーション バージョン: 7.0.600.19
アプリケーション タイムスタンプ: 536a95c6
障害モジュール名: jna3976113557901128571.dll
障害モジュール バージョン: 4.0.0.215
障害モジュール タイムスタンプ: 52d3949a
例外コード: c0000005
例外オフセット: 0000e3a2 OS バージョン: 6.1.7601.2.1.0.256.1
ロケール ID: 1033
追加情報 1: 7bc2
追加情報 2: 7bc24d73a5063367529b81d28aecc01c
追加情報 3: 5bea
追加情報 4: 5beaa1c0441c3adb156a170a191c9

プライバシーに関する声明をオンラインで読む:
http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x0409

オンラインのプライバシーに関する声明が利用できない場合は、オフラインでプライバシーに関する声明をお読みください: C:\Windows\system32\en-US\erofflps.txt

4

1 に答える 1

0

マッピングにいくつかのエラーがあります。構造は次のようになります (IntByReference は、 のアドレスを渡す場所を表し、プリミティブ ネイティブ配列をint置き換えることはできません)。ネイティブ型が Java 型にどのようにマップされるかを理解するには、JNA マッピングのドキュメントを参照してください。Stringchar

public static class LP_DEVICE_INFO extends Structure{
    public SDK_SYSTEM_TIME tmBuildTime;
    public byte[] sSerialNumber = new byte[64];      
    public int byChanNum;              
    public int uiDeviceRunTime;  
    public int deviceType; // Assuming the size of the enum is int
    @Override
    protected List<Object> getFieldOrder() {
        List<Object> list = new ArrayList<>();
        list.add("tmBuildTime");
        list.add("sSerialNumber");
        list.add("byChanNum");
        list.add("uiDeviceRunTime");
        list.add("deviceTpye");
        return list;
    }    
}

public static class SDK_SYSTEM_TIME extends Structure{
    public int year;  
    public int month;  
    public int day;
    @Override
    protected List<Object> getFieldOrder() {
        List<Object> list = new ArrayList<>();
        list.add("year");
        list.add("month");
        list.add("day");
        return list;
    }
}
于 2015-01-04T20:35:08.323 に答える