JNIWrapperを使用して C 構造を Java にマップし、DLL から関数を呼び出すことができます。
指定された構造体のラッパーは次のようになります (サイズ定数の値を変更する必要があります)。
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;
}
}
構造体インスタンスへのポインタが必要な場合は、Pointer クラス インスタンスを作成する必要があります。
IpjIriDevice structureInstance = new IpjIriDevice();
Pointer structurePtr = new Pointer(structureInstance);
その後、ポインター インスタンスを使用して関数パラメーターを渡すことができます。次のコードは、ライブラリをロードしてそこから関数を呼び出す方法を示しています。
DefaultLibraryLoader.getInstance().addPath(LIB_PATH);
Library library = new Library(LIB_NAME);
Function function = library.getFunction(FUNCTION_NAME);
long errorCode = function.invoke(returnValue, structurePtr);
呼び出し後に構造が変更された場合、すべての変更は structureInstance オブジェクトで利用可能になります。
ご覧のとおり、この場合、追加のネイティブ コードを記述する必要はありません。
JNIWrapperの使用に関する詳細については、そのプログラマー ガイドを参照してください。また、多くの一般的な質問への回答が含まれているJNIWrapper フォーラムもあります。