结构 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 返回错误值的主要内容,如果未能解决你的问题,请参考以下文章