【问题标题】:JNA: Pointer to char**JNA:指向字符的指针**
【发布时间】:2015-02-17 19:41:09
【问题描述】:

我拥有下一个 C 函数:

int fillWithNames(const char*** names, int *n);

我使用 JNA 将其转换为 java,如下所示:

public interface PlayersLibrary extends Library {
        PlayersLibrary INSTANCE = (PlayersLibrary) Native.loadLibrary("player", PlayersLibrary.class);

int fillWithNames(PointerByReference names, IntByReference n);

}

如何打印此方法在names 中返回的字符串?

我想做这样的事情:

PlayersLibrary.INSTANCE.fillWithNames(names, n);

Pointer first = names.getValue(); // char**
String a = first.getPointer(0).getValue() // char*
System.out.println(a);

但在这种情况下,names.getValue() 返回 null,我不知道该怎么办

我能做些什么来解决这个问题?

【问题讨论】:

  • 在编写一行 Java 之前,您是否能够通过从 C++ 调用它来使您的函数工作?还是C?我问这个,因为“三星级”编程很容易出错,更不用说尝试将 Java 与这样的东西接口了。
  • 你好@PaulMcKenzie,是的,我已经检查过该函数在 C++ 中是否有效。这是我拥有的遗留库
  • 如果你从Pointer.getValue() 得到一个null 值,这意味着被调用者从未写过你给它的空间。也许你应该给它n 参数的整数地址,以便它可以告诉你它填充了多少?包括初始化namesn 的代码。

标签: java c++ c jna


【解决方案1】:

使用names.getValue().getStringArray(0, n.getValue()])

我推断n 参数告诉被调用者要填写多少个名称。getStringArray() 会将内存中的连续指针值转换为字符串,直到遇到NULL 值;如果您的被调用者没有以 NULL 指针终止,您需要明确告诉它要读取多少个指针(表面上是对 fillWithNames() 的调用中的 n 参数)。

编辑

所以长度确实在n 参数中返回。如果被调用者向该参数写入零,那么它会告诉您它没有名称(这就是为什么您在另一个参数中得到 null 的原因)。

【讨论】:

  • 你好,不,函数写入两个参数。而且names是一个指向const char**的指针,所以内存有点乱,因为它不像char[][]那样是连续的
  • const char** 还是const char***?巨大差距。我推断被调用者将const char**写入您传入的内存。您通过调用PointerByReference.getValue()获取该值,此时您应该能够提取字符串数组(假设返回的指针不是@987654336 @)。
  • 它是一个 const char***,见上文。是的,你推断得差不多了。我调用的函数分配一些内存,写入字符串,以及它写入的字符串数量。 C代码示例:const** char test; fillWithNames(&test, &n);
  • @broga 记录C代码中指针的值。然后记录在 JNA 代码中调用函数时获得的值。它们是相同的值吗?我不是指 what 被指向,而是实际的指针值本身。我不明白(请原谅我的无知)是为什么您最初没有使用getPointer(0) 来获取char**,而是使用getValue
  • 在 C++ 方面,这里是尝试复制您的场景的示例代码。也许如果您更改此代码以适应您正在做的事情,那么您可能在 C++ 方面犯了一个错误(即使您说它正在工作)。 coliru.stacked-crooked.com/a/4afad0c59aefb836
【解决方案2】:

Class PointerByReference

表示对指向本机数据的指针的引用。在 C 表示法中,void**

另外,请参阅SO: PointerByReference not returning value

【讨论】:

  • 发帖前我查了很多资料来源,感谢您的帮助,但这种回答无济于事。给我看代码
猜你喜欢
  • 1970-01-01
  • 2012-03-28
  • 1970-01-01
  • 2013-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-26
  • 2013-04-26
相关资源
最近更新 更多