您可以使用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;
}
}
如果你需要一個指向結構的情況下,你應該創建指針類實例:
IpjIriDevice structureInstance = new IpjIriDevice();
Pointer structurePtr = new Pointer(structureInstance);
之後,您可以使用指針實例傳遞函數參數。下面的代碼演示瞭如何加載庫,並從中調用該函數:
如果結構被調用後修改,所有的改變將在structureInstance對象是可用的。
正如你所看到的,在這種情況下,你不需要寫任何額外的本地代碼。
您可以找到有關其programmer's guide使用JNIWrapper更多細節。此外,還有JNIWrapper forum,其中包含許多常見問題的答案。
你不能在java中明確地使用(void)指針。你到一個void *最接近的是使用一個對象作爲類型(並保存在IPJ_READER_CONTEXT和IPJ_READER_IDENTIFIER一個單獨創建對象的相關信息) – ParkerHalo
如果你想從Java調用,這裏的圖書館是一個共享庫函數用C寫的你可能會發現SWIG是你的朋友? – bph
我無法使用swig,因爲我無法編輯現有的C代碼來調整它以符合要求。 – mayooran