【问题标题】:JNA How to pass struct from Java to C++ method?JNA 如何将结构从 Java 传递到 C++ 方法?
【发布时间】:2015-04-07 04:53:30
【问题描述】:

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

【问题讨论】:

  • "我的代码没有返回它应该返回的数据。"
  • 应该有多少回复?我怀疑是字节顺序问题...
  • @Andrej fge 在这里。在调试器中检查 int 作为字节,我猜你会看到问题 -32704 是可疑的。
  • @Andrej “-32704 不可疑 - [...] 返回这样的值然后有些地方不正确”
  • 如果您的库使用 stdcall 调用约定,请确保扩展 StdCallLibrary 而不是 Library。重命名库接口也是一个好主意,因为您没有映射到 C 运行时库。

标签: java jna


【解决方案1】:

如果你的原生方法期望结构是传值,你需要声明并传递一个实现Structure.ByValue的参数。

通常您会定义一个附加类,如下所示:

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

那么您的映射声明如下所示:

int DownloadData(DateTime.ByValue dateTime);

【讨论】:

    猜你喜欢
    • 2016-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多