È possibile utilizzare JNIWrapper per mappare la struttura C su Java e chiamare la funzione dalla DLL.
Il wrapper per la struttura data sarà simile mostrato di seguito (i valori per le dimensioni costanti devono essere cambiato):
import com.jniwrapper.*;
public class IpjIriDevice extends Structure
{
private static final int IPJ_RECEIVE_BUFFER_SIZE = 0;
private static final int IPJ_TRANSMIT_BUFFER_SIZE = 0;
private Pointer.Void reader_context = new Pointer.Void();
private Pointer.Void reader_identifier = new Pointer.Void();
private UInt32 receive_timeout_ms = new UInt32();
private UInt8 sync_state = new UInt8();
private Bool wait_for_response = new Bool();
private UInt32 frame_length = new UInt32();
private UInt32 receive_index = new UInt32();
private PrimitiveArray receive_buffer = new PrimitiveArray(UInt8.class, IPJ_RECEIVE_BUFFER_SIZE);
private PrimitiveArray transmit_buffer = new PrimitiveArray(UInt8.class, IPJ_TRANSMIT_BUFFER_SIZE);
public IpjIriDevice()
{
init(new Parameter[] {
reader_context,
reader_identifier,
receive_timeout_ms,
sync_state,
wait_for_response,
frame_length,
receive_index,
receive_buffer,
transmit_buffer
});
}
public long getReaderContext()
{
return reader_context.getValue();
}
public long getReaderIdentifier()
{
return reader_identifier.getValue();
}
public long getReceiveTimeoutMs()
{
return receive_timeout_ms.getValue();
}
public void setReceiveTimeoutMs(long value)
{
receive_timeout_ms.setValue(value);
}
public long getSyncState()
{
return sync_state.getValue();
}
public void setSyncState(long value)
{
sync_state.setValue(value);
}
public boolean getWaitForResponse()
{
return wait_for_response.getValue();
}
public void setWaitForResponse(boolean value)
{
wait_for_response.setValue(value);
}
public long getFrameLength()
{
return frame_length.getValue();
}
public void setFrameLength(long value)
{
frame_length.setValue(value);
}
public long getReceiveIndex()
{
return receive_index.getValue();
}
public void setReceiveIndex(long value)
{
receive_index.setValue(value);
}
public PrimitiveArray getReceiveBuffer()
{
return receive_buffer;
}
public PrimitiveArray getTransmitBuffer()
{
return transmit_buffer;
}
public Object clone()
{
IpjIriDevice result = new IpjIriDevice();
result.initFrom(this);
return result;
}
}
Se avete bisogno di un puntatore alla istanza di struttura, è necessario creare il puntatore istanza di classe:
IpjIriDevice structureInstance = new IpjIriDevice();
Pointer structurePtr = new Pointer(structureInstance);
Dopodiché, è possibile utilizzare l'istanza del puntatore per passare il parametro della funzione. Il codice di seguito viene illustrato come caricare la libreria e chiama la funzione da esso:
DefaultLibraryLoader.getInstance().addPath(LIB_PATH);
Library library = new Library(LIB_NAME);
Function function = library.getFunction(FUNCTION_NAME);
long errorCode = function.invoke(returnValue, structurePtr);
Se la struttura viene modificata dopo la chiamata, tutte le modifiche saranno disponibili nell'oggetto structureInstance.
Come potete vedere, in questo caso non è necessario scrivere alcun codice nativo aggiuntivo.
È possibile trovare ulteriori dettagli sull'utilizzo di JNIWrapper nel suo programmer's guide. Inoltre, c'è lo JNIWrapper forum che contiene le risposte a molte domande popolari.
Non è possibile lavorare esplicitamente con i puntatori (void) in java. Il più vicino a un vuoto * utilizza un oggetto come tipo (e salva le informazioni pertinenti in un oggetto creato individualmente per IPJ_READER_CONTEXT e IPJ_READER_IDENTIFIER) – ParkerHalo
Se stai provando a chiamare una funzione di libreria condivisa da Java, dove la libreria era scritto in C potresti trovare SWIG è tuo amico? – bph
Non ho potuto usare swig perché non posso modificare il codice C esistente per adattarlo ai requisiti. – mayooran