JNA如何将结构从Java传递给C ++方法?

时间:2013-01-13 17:56:31

标签: java jna

我正在使用JNA访问DLL库(C ++)方法。

我想要访问的方法具有以下签名: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 即可。如果我发送空值CLibrary.INSTANCE.DownloadData(null),我会得到相同的结果

1 个答案:

答案 0 :(得分:2)

如果您的本机方法期望按值传递结构,则需要声明并传递实现Structure.ByValue的参数。

通常,您将按如下方式定义其他类:

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

然后您的映射声明如下所示:

int DownloadData(DateTime.ByValue dateTime);