当前位置: 首页 > 面试题库 >

如何获得对DLL的Java JNA调用以获取参数中返回的数据?

卢俭
2023-03-14
问题内容

我有这个java测试

package ftct;

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
import com.sun.jna.win32.StdCallLibrary;
import java.util.Date;

public class LibFTCT {


public LibFTCT() {
 }
 public interface LibFTCTLib extends StdCallLibrary {
          LibFTCTLib INSTANCE = (LibFTCTLib) Native.loadLibrary(
             "FTCTLib", LibFTCTLib.class);
      int a(int x);
      int DoCommand(int Command, int Param);
    int GetDataRecord(int RecordNum, int StreamNum, Date ReadingTime,
   double AIN1, double AIN2, double AIN3, double AIN4);

 }
}

它调用一个Delphi DLL。如果在Delphi中将参数设置为var,则Java崩溃。否则,它们是只读的。

我希望GetDataRecord返回RecordNum等中的数据。如何在Java中执行此操作?


问题答案:

您需要将参数声明为特殊类型,以传达通过引用传递它们的事实。因此,如果Delphi参数是这样的:

procedure Foo(var i: Integer; var d: Double);

您可以将其映射到这样的Java函数:

void Foo(IntByReference i, DoubleByReference d);

并调用该函数:

IntByReference iref = new IntByReference();
DoubleByReference dref = new DoubleByReference();
INSTANCE.Foo(iref, dref);
int i = iref.getValue();
double d = dref.getValue():

文档中对此进行了详细介绍:

使用ByReference参数

当函数接受指向类型的指针参数时,您可以使用ByReference类型之一来捕获返回的值,或者使用您自己的子类。例如:

// Original C declaration
void allocate_buffer(char **bufp, int* lenp);

// Equivalent JNA mapping
void allocate_buffer(PointerByReference bufp, IntByReference lenp);

// Usage
PointerByReference pref = new PointerByReference();
IntByReference iref = new IntByReference();
lib.allocate_buffer(pref, iref);
Pointer p = pref.getValue();
byte[] buffer = p.getByteArray(0, iref.getValue());

另外,您可以将Java数组与所需类型的单个元素一起使用,但是ByReference约定可以更好地传达代码的意图。除了getByteArray()之外,Pointer类还提供了许多访问器方法,这些方法可以有效地用作对内存的类型转换。

类型安全的指针可以通过从PointerType类派生来声明。



 类似资料:
  • 问题内容: 这听起来对你们中的几个人来说很容易,但是我什至无法弄清楚为什么我即使在收到很多帖子后也无法获得返回值:( 现在如果我打电话; 它给了我不确定的:(当方法内部计数正确时,即服务运行正常。 问题答案: 那是因为调用是异步的。 如果您将代码编辑为以下内容: 然后,当您调用它时:

  • 问题内容: 我想使用函数在ajax调用中获取值。但是该值始终返回未定义状态。返回值仅为1或0。 这是我的代码: 大家好,仍在努力完成这项工作。我现在得到的值显示为1或0。我现在想要完成的是如何在if语句中实现它。我想吃点这样的东西。如果val=0,则返回true;否则,返回true。否则返回假。我不确定我是否在使用ajax函数的正确轨道上。但是,如果有更好的方法可以告诉我,我将不胜感激。 问题答案

  • 问题内容: 我已经使用过返回一定数量的行。我的代码是这样的: 有没有什么方法可以检查返回的行数?还是我必须自己写? 问题答案: 您可以使用循环而不是循环,以便在执行循环后调用该循环,如下所示: 或自己计算行数:

  • 问题内容: 我没有运气让Mockito捕获函数参数值!我在模拟搜索引擎索引,而不是建立索引,而是使用哈希。 我不能使用任意参数,因为我正在测试查询的结果(即查询返回的文档)。同样,我也不想为每个文档指定特定的值,也不要为每行指定一行! 我查看了“ 使用Mockito”页面上的“回调”部分。不幸的是,它不是Java,我无法对此做出自己的解释才能在Java中工作。 编辑(为澄清起见):如何获取Mock

  • 问题内容: 我正在使用以下代码来获取JavaScript调用者函数的名称: 有没有办法发现调用该方法的行号? 另外,是否有办法获取调用该方法的JavaScript文件的名称?还是源URL? 问题答案: 这适用于我在chrome / QtWebView中

  • 问题内容: 是否可以获取从调用范围返回函数的行号? 例: 我认为这是不可能的,因为它应该已经从堆栈中删除了,但是也许它仍然被缓存在某个地方? 用例是我有一个HTTP处理程序,我想记录返回错误的行和文件名,而不必乱扔代码。 问题答案: AFAIK,不可能自动获取执行最后一次返回的行。 但是,有了一个小帮手,您可以拥有: 操场 输出: