JAVA -JNA: я не могу изменить поле структуры во всей функции обратного вызова - PullRequest
1 голос
/ 09 мая 2020

У меня проблема с обратными вызовами 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{};

}

1 Ответ

0 голосов
/ 10 мая 2020

Вы изменяете структуру, но не так, как предполагали.

Класс Structure JNA сопоставляет свои поля Java с соответствующими смещениями в собственной памяти для эквивалента C struct.

В этом случае, как вы определили структуру, вы пытаетесь записать поле Sorter, поле 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 на собственной стороне.

...