java - 结构 JNA 返回错误值

标签 java c++ scala java-native-interface jna

从 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 的地方。

最佳答案

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

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

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++ 中的本地代码将所有这些东西绑定(bind)在一起本身。

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++ 结构之间的类型匹配很重要。

关于java - 结构 JNA 返回错误值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57674427/

相关文章:

Scala:您知道任何高级 Actors 文档/教程吗?

scala - 如何考虑模式匹配右侧枚举的所有情况

scala - 编译器无法为无形的 LabelledGeneric 找到正确的隐式

java - JaxB 编码(marshal)拆收器覆盖文件内容

java - 无法将主类中的字符串值设置为setter

java - 如何检查tomcat服务器是否正在监听特定端口?

java - 在 Java 中创建多列组合框

c++ - 这是违法的吧?

c++ - C++ 中的 glutIdleFunc() 变量值未递增

c++ - 如果键不存在,为什么 std::map operator[] 会创建一个对象?