簡體   English   中英

JNA如何將結構從Java傳遞到C ++方法?

[英]JNA How to pass struct from Java to C++ method?

我正在使用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)我有相同的結果

如果您的本機方法期望按值傳遞結構,則需要聲明並傳遞一個實現Structure.ByValue的參數。

通常,您將定義一個附加類,如下所示:

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

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

int DownloadData(DateTime.ByValue dateTime);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM