I have the a JNA structure which is throwing InvalidMemoryAccessException occasionally. Without changing the code,when I run it, it runs at times. At times it throw the exception as shown below.
Exception in thread "main" java.lang.Error: Invalid memory access
at com.sun.jna.Native.getInt(Native Method)
at com.sun.jna.Pointer.getInt(Pointer.java:602)
at com.sun.jna.Pointer.getValue(Pointer.java:390)
at com.sun.jna.Structure.readField(Structure.java:653)
at com.sun.jna.Structure.read(Structure.java:521)
at com.sun.jna.Structure.autoRead(Structure.java:1882)
at com.sun.jna.Structure.conditionalAutoRead(Structure.java:491)
at com.sun.jna.Function.invoke(Function.java:418)
Shown below is my structure in C.
RFIDLIB_API ipj_error start(
ipj_iri_device* iri_device ,
ipj_action action );
typedef uint32_t ipj_action;
Below is my Java implementation.
public class ipj_action extends Structure {
public int ipj_action_value;
public ipj_action() {
setAlignType(Structure.ALIGN_NONE);
allocateMemory();
read();
}
@Override
protected List getFieldOrder() {
return Arrays.asList("ipj_action_value");
}
}
Below is the main class from where I call it.
public class RFIDMain {
public rfidlib rlib;
public ipj_iri_device ipj_iri_device;
public ipj_action ipj_action;
public ipj_error errorStatus;
public static void main(String[] args) {
RFIDMain r = new RFIDMain();
r.rlib = (rfidlib) Native.loadLibrary("rfidlib", rfidlib.class);
r.ipj_iri_device = new ipj_iri_device();
r.ipj_action = new ipj_action();
r.errorStatus = new ipj_error();
r.ipj_action.ipj_action_value = 0x1;
r.errorStatus = r.rlib.start(r.ipj_iri_device, r.ipj_action);
System.out.println(r.errorStatus);
}
}
I can't figure exactly when it is working and when it is throwing an exception. Is this some problem with the memory allocation for the structure? Please advice.