为什么偶尔会抛出无效的内存访问异常?

时间:2015-11-11 05:18:19

标签: java c exception native jna

我有一个偶尔抛出InvalidMemoryAccessException的JNA结构。在不更改代码的情况下,当我运行它时,它有时会运行。有时会抛出异常,如下所示。

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)

下面显示的是我在C中的结构。

 RFIDLIB_API ipj_error start(
    ipj_iri_device* iri_device       /*[in]*/,
    ipj_action      action           /*[in]*/);

 typedef uint32_t ipj_action;

以下是我的Java实现。

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");

}

}

以下是我称之为的主要课程。

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);
}

}

当我对“r.ipj_action.ipj_action_value = 0x01”行进行任何修改时,不会抛出异常。就像我删除并运行它一样,它会运行。如果我在删除后将其放入并再次运行则运行。如果我保持原样并运行它会引发异常。就像我保持没有该行的代码并运行两次一样,抛出异常。同样,如果我将代码保留在该行并再次运行两次,则抛出异常。这个结构的内存分配有问题吗?请指教。

0 个答案:

没有答案