[英]How to pass a com.sun.jna.Structure from Java to struct in C, using JNA
[英]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.