JAVA-JNA : 我无法在整个回调函数中修改结构字段
JAVA-JNA : I can't modify a structure field throughout a callback function
我对 JNA 回调有疑问。在我的 JAVA 程序中,我使用了一个将由本机库调用的函数指针。这个函数指针是:
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
class 将其 Java 字段映射到 C struct
等价物的本机内存中的适当偏移量。
在这种情况下,按照您定义结构的方式,您正试图写入 Sorter
字段,一个 short
(2 字节)字段,距离结构的开始。
然而,这可能不是 Sorter
在本机方面的地方。我不确定你的 39
来自哪里,但我在网上看到的本机代码有:
char CodelineRead[CODE_LINE_LENGTH]; // Codeline returned
定义了该值:
#define CODE_LINE_LENGTH 256 // Max length of returned codeline
所以在字节 51-52 处写入是行不通的,因为您是在本机端 CodeLineRead
数组的中间写入。
我对 JNA 回调有疑问。在我的 JAVA 程序中,我使用了一个将由本机库调用的函数指针。这个函数指针是:
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
class 将其 Java 字段映射到 C struct
等价物的本机内存中的适当偏移量。
在这种情况下,按照您定义结构的方式,您正试图写入 Sorter
字段,一个 short
(2 字节)字段,距离结构的开始。
然而,这可能不是 Sorter
在本机方面的地方。我不确定你的 39
来自哪里,但我在网上看到的本机代码有:
char CodelineRead[CODE_LINE_LENGTH]; // Codeline returned
定义了该值:
#define CODE_LINE_LENGTH 256 // Max length of returned codeline
所以在字节 51-52 处写入是行不通的,因为您是在本机端 CodeLineRead
数组的中间写入。