【问题标题】:Convert void** pointer to equivalent Java type将 void** 指针转换为等效的 Java 类型
【发布时间】:2013-04-07 18:09:42
【问题描述】:

我正在从用 Java 编写的程序中加载 C DLL。 我希望能够使用此声明从 DLL 中调用其中一种方法:

dll_function(const char* foo1, const char* foo2, const char* foo3, void** bar, size_t* bar2);

如何在 Java 中使用正确类型的参数调用此方法? 我知道(理论上)如何调用它,但我想知道如何传递“void** " 和 "size_t*" 来自我的 Java 程序?基本上,我想知道 void 和 size_t*** 的“等效类型”是什么在 Java 中...

我找到了 Pointer 类但没有设法让它工作? 非常感谢:)

【问题讨论】:

  • 你没有。这些概念是不可映射的。您必须了解如何使用这些值和“作弊”。或者编写一个 C 包装器。

标签: java pointers dll types


【解决方案1】:

几年前我从事过一个 Java/JNI/C 项目,我们不得不在 Java 对象中维护不透明的 C 指针。我们在 Java 端使用 long 值来保存 C 指针,这些指针在 JNI 端从 jlong 转换为 void* 或我们需要的任何指针类型。

由于 Java long 类型为 64 位宽,而 JNI/C 指针通常为 32 位或 64 位宽,因此在它们之间进行转换没有任何问题。

【讨论】:

    【解决方案2】:

    size_t 是一个整数,用于表示内存中变量的大小;因此,在 Java 中使用 unsigned long 应该是安全的。

    void* 可能是一个指向未知类型对象的指针。 This question,这件事很有趣。在 Java 中,Object 通常用于这种情况,但我不知道您将如何在它们之间进行转换,尽管this question 可能会有所帮助。

    【讨论】:

    • 啊,好点子。在这种情况下,long 为 32 位代码(因为它是一个 64 位有符号整数),或BigInteger 为 64 位代码。考虑一下,所以记录一下,因为你实际上并没有在 Java 代码中对它做任何事情,你也可以只用很长的 64 位寻址就可以逃脱,只要 Java 和本机语言之间的转换没有'不要破坏它,并且可以重新解释二进制文件,就好像它是一个 size_t。
    • 我阅读了JDK源代码。 long 用于在 JDK 本身中存储“对等对象”(如果您有兴趣,请搜索 AWTObject 并查找 pData 指针)。 Android 源代码也出于相同目的使用long。所以我认为使用long 是最好的做法。
    【解决方案3】:

    我尝试了您的解决方案,但我想我并没有真正理解正确... 但我用这个解决了我的问题:

    import com.sun.jna.ptr.IntByReference;
    

    我在我的 Java 程序中这样调用 C 函数:

    IntByReference myVoidPointerPointer = new IntByReference();
    myCLibrary.myCFunction(myVoidPointerPointer);
    

    C 函数“myCFunction”如下所示:

    void myCFunction(void** parameter);
    

    这样做可以吗?它正在工作,但我想知道这是否是正确的方法。

    【讨论】:

      猜你喜欢
      • 2021-09-20
      • 1970-01-01
      • 2017-10-07
      • 2015-02-14
      • 1970-01-01
      • 1970-01-01
      • 2014-02-06
      • 2023-02-26
      相关资源
      最近更新 更多