我在JNA回调方面遇到了一个问题。在我的JAVA程序中,我使用了一个将被本地库调用的函数指针。这个函数指针是:_CODELINE_INFO
public int callback(S_CODELINE_INFO codelineInfo)
{
try
{
String codeline=new String(codelineInfo.CodelineRead);
System.out.println("Codeline document : "+codeline); // Reading from DLL is ok
// Set field Sorter (JAVA --> DLL)
codelineInfo.writeField("Sorter", 9); // Writing is KO. The sorted field (sort type) is always equal to 0
}catch(Exception exp)
{
exp.printStackTrace();
}
return 0;
}
_CODELINE_INFO结构。
public class S_CODELINE_INFO extends Structure
{
/************** Parameters compiled from LS500.dll ************************/
// Size of the struct
public short Size;
// Progessive document number
public NativeLong NrDoc;
// Codeline returned
public byte[] CodelineRead=new byte[39];
// Length of the codeline
public short NrBytes;
// Reserved for future use
public NativeLong Reserved;
/****************** Parameters compiled from Application *********************/
// Sorter where put the document
public short Sorter;
// Set from application NORMAL or BOLD
public byte FormatString;
// String to print rear of the document
public String StringToPrint;
public S_CODELINE_INFO()
{
super();
}
@Override
protected List<String> getFieldOrder()
{
return Arrays.asList(new String[]{
"Size", "NrDoc", "CodelineRead", "NrBytes", "Reserved", "Sorter","FormatString", "StringToPrint"
});
}
public static class ByReference extends S_CODELINE_INFO implements Structure.ByReference{};
}
你是在修改结构,只是没有按照你的意图修改。
JNA的 Structure
类将它的Java字段映射到本机内存中适当的偏移量,为C struct
等价物。
在这种情况下,你定义结构的方式,你是在试图写出 Sorter
场,a short
(2字节)字段,偏移量为51字节,从结构开始。
但是,这可能不是 Sorter
是在本机方面。 我不知道你的 39
的来历,但我在网上看到的原生代码有。
char CodelineRead[CODE_LINE_LENGTH]; // Codeline returned
定义了这个值
#define CODE_LINE_LENGTH 256 // Max length of returned codeline
所以写在51 -52字节的时候就不能用了 因为你写在了中间的地方 CodeLineRead
本机侧的数组。