【问题标题】:pass string by reference when use JNA to access .dll使用 JNA 访问 .dll 时通过引用传递字符串
【发布时间】:2015-08-17 05:05:17
【问题描述】:

我需要使用 JNA 从 Java 调用 dll。

我需要调用的dll的头文件中的函数定义是这样的:

bool DmgrGetVersion(char * szVersion);

所以我需要在Java中重新定义一个接口,函数变成:

boolean DmgrGetVersion(String szVersion);

但是,我需要通过引用传递字符串,这意味着我传入的字符串变量需要从函数的参数中接收一个新值。我如何实现这一目标? (例如,如果我调用 DmgrGetVersion(ver) 并且函数中的 szVersion 在函数末尾被分配“1.0.1”,那么ver 也需要被分配“1.0.1”)

我听很多人说String[] str = new String[1]StringBuilderStringBuffer可以用,但不适用于我的情况,因为我没有dll的源代码,无法更改函数的内容。 (我只有头文件和 .lib 和 .dll 文件)

顺便说一句,JNA 文档中没有 char* 的类型转换。 (仅 char 和 const char* 和 char**)

那么我还有可能实现我的需求吗?谢谢大家

【问题讨论】:

    标签: java pass-by-reference jna


    【解决方案1】:

    String 是 Java 中的不可变对象。您不能更改 String 对象的内容。 String[] str = new String[1]char** 的模拟

    【讨论】:

    • 我知道它是不可变的,但我没有其他好的选择......而且在 JNA 文档中没有 char* 的类型转换。 (仅 char 和 const char* 和 char**)
    【解决方案2】:

    传入PointerByReference 的实例,然后使用PointerByReference.getValue() 检索“返回”指针。然后Pointer.getString(0) 将提供引用的字符串。

    虽然String[] 可能有效,但如果您需要释放它,您将无法引用“返回”指针。

    【讨论】:

      猜你喜欢
      • 2013-04-07
      • 1970-01-01
      • 2013-11-23
      • 2014-08-11
      • 2017-07-25
      • 2016-07-05
      • 2018-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多