结构 JNA 返回错误值

Posted

技术标签:

【中文标题】结构 JNA 返回错误值【英文标题】:Structure JNA returns wrong value 【发布时间】:2019-08-27 12:12:31 【问题描述】:

从 C++ 代码我得到了结构。但是我得到的所有值都是默认值。下面是我的 C++ 代码

extern "C" 
 
PDFCONTENTDATA GetPDFContentData(LPTSTR lptszS3FileURL)

PDFCONTENTDATA pdfContentData;
pdfContentData.m_uiRasterDPI = 100;

return pdfContentData;

; 

下面是我的 java/scala 代码

@Structure.FieldOrder( "m_uiRasterDPI")
public class tagPDFContentData extends Structure 

    public static class ByValue extends tagPDFContentData implements Structure.ByValue  
    public static class ByReference extends tagPDFContentData implements Structure.ByReference  
    public volatile int m_uiRasterDPI;



trait CDocuLinkCoreServices extends Library
  def GetPDFContentData(value: Pointer):  tagPDFContentData.ByValue

但我得到了

m_uiRasterDPI=0

它应该返回 100。

【问题讨论】:

请告诉我为什么这被标记为否定。 嗯。为什么它被否决了? @Oo.oO 你能帮我解决这个问题吗? 【参考方案1】:

给你:https://github.com/mkowsiak/jnicookbook/tree/master/recipes/recipeNo057

为了顺利调用JNA,有一个Java 类recipeNo057.Data。这个类超级简单

package recipeNo057;

import com.sun.jna.Library;
import com.sun.jna.WString;
import com.sun.jna.Native;
import com.sun.jna.Structure;

@Structure.FieldOrder( "field" )
public class Data extends Structure 

    public static class ByValue extends Data implements Structure.ByValue  
    public static class ByReference extends Data implements Structure.ByReference  
    public volatile int field;


在另一边(C++ 边)我们有“相同”的结构。

typedef struct data 
  int field;
 

Scala 通过“链接”基于Java 的类、基于JNA 的对本机代码的调用以及C++ 本身中的本机代码,将所有这些东西绑定在一起。

trait HelloWorld extends Library 

  def GetData(m: WString) : Data.ByValue;



object HelloJNA 

  def main(args:Array[String]):Unit = 

    val libc   = Native.load( "HelloWorld", classOf[HelloWorld] )

    var result = libc.GetData( new WString("I am passing String!") )
    println("Result: " + result.field);

  

注意

注意Java 结构和C++ 结构之间的类型匹配很重要。

【讨论】:

感谢您的回答。但就我而言,我仍然得到错误的值。 但是,当我这样做时,您的结构运行良好。 我看到的唯一情况可能与不同的类型有关。例如。在 C++ 代码中,你有一些不同于“int”的东西。在我的例子中,如果你将int field 更改为double field,你也会得到0。因此,请确保您的类型匹配。 啊!我遇到了一些外部 c 问题。这就是它显示默认值的原因。 看起来都是关于 struct padding :( 但是,我仍然不知道如何处理 boolean ;)

以上是关于结构 JNA 返回错误值的主要内容,如果未能解决你的问题,请参考以下文章

JNA ByteBuffer statvfs

JNA 调用 SetTcpEntry 总是返回 317

如何使用 JNA 读取 Linux 命令的输出

使用 JNA 在 Clojure 中按值获取和传递结构

我应该如何在 jna 中按值从 Java 传递和返回 unsigned int 到 C/C++

在NodeJS中返回值时出现循环结构错误