2017-09-15 155 views
0

我正在嘗試使用jna-4.4.0在Java內部包裝C#dll(libxert.dll)。 我在調用方法「xert_alloc」時遇到異常。 請幫忙。JNA:無效的內存訪問

C#

namespace XertLibCsharp 
{ 
    [StructLayout(LayoutKind.Sequential)] 
    public struct XertHandle { 
     IntPtr Mem; 
     IntPtr MemLength; 
    } 
} 

[DllImport("libxert", EntryPoint = "xert_alloc")] 
public static extern XertHandle Allocate(); 

JAVA

import com.sun.jna.Structure; 
import com.sun.jna.ptr.IntByReference; 

public class XertHandle extends Structure { 
    public IntByReference Mem; 
    public IntByReference MemLength; 

    @Override 
    protected List<String> getFieldOrder() { 
     return Arrays.asList("Mem", "MemLength"); 
    } 
} 

public interface libxert extends Library { 
    libxert INSTANCE = (libxert) Native.loadLibrary("libxert", libxert.class); 
    XertHandle xert_alloc(); 
} 

public static void main(String args[]) { 
     libxert jnaLib = libxert.INSTANCE; 
     jnaLib.xert_alloc(); 
} 

例外

Exception in thread "main" java.lang.Error: Invalid memory access 
    at com.sun.jna.Native.invokePointer(Native Method) 
    at com.sun.jna.Function.invokePointer(Function.java:490) 
    at com.sun.jna.Function.invoke(Function.java:443) 
    at com.sun.jna.Function.invoke(Function.java:354) 
    at com.sun.jna.Library$Handler.invoke(Library.java:244) 

我認爲,這不是一個重複的問題,因爲我嘗試了我在堆棧溢出中找到的答案中提到的所有選項, 但沒有解決我的問題。

+0

「我想這是中提到的所有選項」 - 哪些? –

+1

看起來不像'IntByReference'。 'Mem'是'指針'和'MemLength','size_t'。 –

+0

@David Heffernan,我已經改變到下面的公共內存MemLength =新內存(5); public Pointer Mem = MemLength.getPointer(0);'現在我得到異常''main「java.lang.IndexOutOfBoundsException:界限超出可用空間:size = 5,offset = 8 \t at com.sun.jna .Memory.boundsCheck(Memory.java:220) \t at com.sun.jna.Memory.getPointer(Memory.java:540)'請指教 – Chandrahasan

回答

-1

更改內存大小設置爲8,如:

Public Memory MemLength = new Memory(8);