JAVA-JNA : 我不能在回调函数中修改结构域。

问题描述 投票:0回答:1

我在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{};

}
java callback jna
1个回答
0
投票

你是在修改结构,只是没有按照你的意图修改。

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 本机侧的数组。

© www.soinside.com 2019 - 2024. All rights reserved.