我是 JNA 的新手,需要通過 Java 系統(tǒng)的套接字連接將數(shù)據(jù)發(fā)送到遺留 C 系統(tǒng)。我已獲得 .dll 和 .h 文件。我必須使用 .h 文件定義訪問 C 系統(tǒng)中的函數(shù)。我加載了 .dll,當我訪問 dll 中的函數(shù)時,我得到 IllegalArgumentExceptionpublic static void main(String[] args) { Arg arg = new Arg(); ExampleDLL exampleDLL = ExampleDLL.INSTANCE; System.out.println(exampleDLL.someFunctionInDLL(arg));}public interface ExampleDLL extends Library { ExampleDLL INSTANCE = (ExampleDLL) Native.loadLibrary("exampleDLL.dll", ExampleDLL.class); int someFunctionInDLL(Arg arg);}public class Arg { public Byte[] var1 = new Byte[9]; public Byte[] var2 = new Byte[5]; // Getters and Setters....}來自.h 文件:typedef struct{ char var1[9]; char var2[5]; }Arg;int someFunctionInDLL(Arg *dr);我想我已經成功加載了 dll,但是當我嘗試訪問 dll 函數(shù)時:Exception in thread "main" java.lang.IllegalArgumentException: Unsupported argument type com.*.*.*.Arg at parameter 0 of function someFunctionInDLL幫助將不勝感激。有點堅持這個了一段時間。提前致謝。
1 回答

慕碼人2483693
TA貢獻1860條經驗 獲得超9個贊
歡迎來到堆棧溢出。您收到錯誤是因為您的函數(shù)期望的參數(shù)是一個指針,但您為它提供了一個完整的 Java 類。
int someFunctionInDLL(Arg *dr);
您定義的類Arg
應該是一個Structure
. 默認情況下,當用作函數(shù)參數(shù)時,JNA 將 a 轉換Strcuture
為其指針 ( ),而這正是您希望在此處發(fā)生的情況。Structure.ByReference
您應該能夠通過制作Arg
extend來修復您的代碼Structure
。
此外,您將字節(jié)映射到裝箱Byte
對象是錯誤的:您需要原語byte
。@FieldOrder
所以這應該可行(您還需要添加注釋):
public class Arg extends Structure { public byte[] var1 = new byte[9]; public byte[] var2 = new byte[5]; }
添加回答
舉報
0/150
提交
取消