Sto iniziando a utilizzare JNA per comunicare con un dispositivo sull'interfaccia RS485 di un computer. Sorprendentemente per me sono arrivato a buoni risultati molto rapidamente. Ma ora sono bloccato da un semplice problema. La libreria che uso accetta un puntatore a un puntatore di struct. La firma reale èJNA: imposta il puntatore struct su NULL
func(Struct1 **, Struct2 **, Struct3 *, Struct4 *, long)
Ora per indicare la dimensione del primo parametro della biblioteca si aspetta che l'ultimo puntatore a un puntatore NULL. Questo è ciò che fallisce. A seguito di codice è quello che ho provato finora:
Struct1.ByReference[] s = (Struct1.ByReference[]) new Struct1.ByReference().toArray(size);
int pos = 0;
// ...
// for loop to set the s[pos] struture values
for(pos = 0; pos < size - 1; pos++)
// ...
// Now set the last array element to a null pointer to indicate end-of-list
s[pos].getPointer().setPointer(0, null);// Following does not work: results in zero memoried structure
s[pos] = null; // Following does not work wither: NullPointerException at com.sun.jna.Structure.autoWrite
EDIT 1
s[pos] = new Struct1.ByReference(Pointer.NULL); // results in zero memoried structure as well
EDIT 2
Secondo la domanda di TechnoMage. Se dovessi scrivere codice C sarebbe probabilmente sembrare qualcosa di simile:
Struct1 **s = malloc(n * sizeof(Struct1*));
for(int i=0; i<n; i++)
{
if(i == n -1)
{
s[i] = NULL;
}
else
{
s[i] = malloc(sizeof(Struct1));
s[i].bla = value;
....
}
}
Ma si ricordi: io non sono molto abile in C/C++. Considero Java come il mio dominio.
Qualcuno ha avuto un problema simile? Forse non vedo il legno per gli alberi ...
Grazie in anticipo.
Si prega di includere un esempio di utilizzo nativo. Le dichiarazioni delle funzioni per le variazioni del puntatore possono essere ambigue senza quel contesto: non c'è modo di distinguere tra un puntatore a un array, un puntatore a un singolo valore del puntatore o molte altre varianti. – technomage
Cosa intendi con "esempio di utilizzo"? La libreria è stata adottata dal codice di un dispositivo incorporato che esegue FreeRTOS, un sistema operativo in tempo reale open source. Non ho alcun codice nativo oltre al file di intestazione che esporta i metodi della libreria. –
Se si dovesse scrivere codice in 'C' che accede alla libreria nel modo desiderato, come si presenterebbe? – technomage