结构 JNA returns 错误值
Structure JNA returns wrong value
我从 C++ 代码得到 structure.But 我得到的所有值都是默认值 value.Below 是我的 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
它应该在哪里 return 100.
给你:https://github.com/mkowsiak/jnicookbook/tree/master/recipes/recipeNo057
为了顺利调用JNA
,有JavaclassrecipeNo057.Data
。这个class超级简单
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++
边)我们有 "the same" 结构。
typedef struct data {
int field;
}
Scala 通过基于 "linking" Java
的 class、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++ 代码得到 structure.But 我得到的所有值都是默认值 value.Below 是我的 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
它应该在哪里 return 100.
给你:https://github.com/mkowsiak/jnicookbook/tree/master/recipes/recipeNo057
为了顺利调用JNA
,有JavaclassrecipeNo057.Data
。这个class超级简单
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++
边)我们有 "the same" 结构。
typedef struct data {
int field;
}
Scala 通过基于 "linking" Java
的 class、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++
结构之间的类型匹配很重要。