4

DLL ライブラリ (C++) メソッドにアクセスするために JNA を使用しています。

アクセスしたいメソッドには、次の署名があります。int DownloadData(DateTime dateTime);

Return Values
  COM_ERROR if an error occurs.
  0 if no new records to download.
  # of records transferred, if successful.

、DateTime は構造体 (C++ コード):

struct DateTime
{
  int minute;
  int hour;
  int day;
  int month;
  int year;
};

私は次の方法でやっています:

import com.sun.jna.FunctionMapper;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.NativeLibrary;
import com.sun.jna.Structure;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

class JavaApplication1
{
     public static class DateTime extends Structure {
        public int minute;
        public int hour;
        public int day;
        public int month;
        public int year;
     }

...

     public interface CLibrary extends Library
     {
        CLibrary INSTANCE = (CLibrary) Native.loadLibrary("LibPro", CLibrary.class, options);
        int DownloadData(DateTime dateTime);
     }

...

     public static void main(String[] args)
     {
        DateTime dateTime = new DateTime();
          dateTime.day=1;
          dateTime.hour=0;
          dateTime.minute=0;
          dateTime.month=1;
          dateTime.year=2012;
        System.out.println("Record count : "+CLibrary.INSTANCE.DownloadData(dateTime));
     }
}

しかし、私のコードは転送されたレコードの数を返しませんが、-32704 を返します。ライブラリは通常、そのような値を返しますが、何かが間違っています。

私はJNA用語で正しくやっていますか? 他に何を試すことができますか?

手伝ってくれてありがとう!

UPD。null 値を送信CLibrary.INSTANCE.DownloadData(null)すると、同じ結果が得られます

4

1 に答える 1

2

ネイティブ メソッドが構造体が値渡しされることを想定している場合は、 を実装するパラメーターを宣言して渡す必要がありますStructure.ByValue

通常、次のように追加のクラスを定義します。

public class DateTime extends Structure {
    public class ByValue extends DateTime implements Structure.ByValue { }
}

次に、マッピング宣言は次のようになります。

int DownloadData(DateTime.ByValue dateTime);
于 2015-04-06T20:53:30.387 に答える