gpt4 book ai didi

java - JNA 如何将结构从 Java 传递到 C++ 方法?

转载 作者:搜寻专家 更新时间:2023-11-01 03:25:45 25 4
gpt4 key购买 nike

我正在使用 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 方面做得对吗?我还能尝试什么?

感谢您的帮助!

更新。如果我发送空值 CLibrary.INSTANCE.DownloadData(null) 我得到相同的结果

最佳答案

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

通常你会定义一个额外的类如下:

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

然后你的映射声明看起来像这样:

int DownloadData(DateTime.ByValue dateTime);

关于java - JNA 如何将结构从 Java 传递到 C++ 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14306398/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com