Java 结构JNA返回错误的值 从C++代码中我得到了结构,但是我得到的所有值都是默认值。下面是我的C++代码< /P> extern "C" { PDFCONTENTDATA GetPDFContentData(LPTSTR lptszS3FileURL) { PDFCONTENTDATA pdfContentData; pdfContentData.m_uiRasterDPI = 100; return pdfContentData; } };
下面是我的java/scala代码Java 结构JNA返回错误的值 从C++代码中我得到了结构,但是我得到的所有值都是默认值。下面是我的C++代码< /P> extern "C" { PDFCONTENTDATA GetPDFContentData(LPTSTR lptszS3FileURL) { PDFCONTENTDATA pdfContentData; pdfContentData.m_uiRasterDPI = 100; return pdfContentData; } };,java,c++,scala,java-native-interface,jna,Java,C++,Scala,Java Native Interface,Jna,下面是我的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 tag
@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的位置。给你:
为了顺利调用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++
side),我们有“相同”的结构
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++
结构之间的类型匹配很重要。请告诉我为什么标记为negative.Hm。为什么被否决?@Oo.Oo你能帮我匹配一下吗?谢谢你的回答。但在我的情况下,我仍然得到了错误的值。但是当我这样做时,你的结构运行良好。我可以看到,唯一的情况可能与不同的类型有关。比如C++代码里面有一些不同于“int”的代码。在我的例子中,如果您将int-field
更改为double-field
,您也将得到0
。所以,确保你的类型匹配。啊!我遇到了一个问题,就是外部c出现了一些问题。这就是为什么它显示默认值。看起来它完全是关于结构填充的:(但是,我仍然不知道如何处理布尔值
;)