假設我有一個叫test.dll的動態庫,其中有一個函數如下:
extern "C" int add(int* a,int* b,int* c,int d,char* PicPath)
{
FILE *fp;
fp=fopen(PicPath,"wt");
for(int i=0;i< p>
{
c[i]=a[i]+b[i];
fprintf(fp,"%d\n",c[i]);
}
fclose(fp);
return 1;
}
該函數的功能是a,b兩個數組的值相加,和存放的數組c中,在將和寫入到指定的文件,數組的維數
有傳入的參數決定。
問題提出:
1.Java中如何調用指針類型的參數;
2.整形的參數可以直接傳入嗎?;
3.PicPath為何是指針型的,怎麼不是CString類型的;
4.如何獲取輸入型參數的返回值;
Java調用動態鏈接庫的代碼如下:
JNative t= new JNative("test.dll", "add"); //加載test.dll文件,並調用add方法;
t.setRetVal(Type.INT); // 設置調用後的返回類型
// Java中構造指針,並為指針分配空間
Pointer a = new Pointer(MemoryBlockFactory.createMemoryBlock(4 * 10));
Pointer b = new Pointer(MemoryBlockFactory.createMemoryBlock(4 * 10));
Pointer c = new Pointer(MemoryBlockFactory.createMemoryBlock(4 * 10));
Pointer strP= createPointer(100);
strP.setStringAt(0, "C:\\1.txt");
int d=10;
// 為數組a和b賦值
for (int i = 0; i < i++)>
a.setIntAt(4 * i, i);
b.setIntAt(4 * i, i);
}
// 設置參數:
t.setParameter(0, a);
t.setParameter(1, b);
t.setParameter(2, c);
t.setParameter(3, d);
t.setParameter(4, strP);
t.invoke(); // 調用函數並執行
// 輸出和的值,注意:一個整形值需要用4個字節存儲,所以j前面需要乘以4
for (int j = 0; j < j++)>
System.out.println(c.getAsInt(4 * j));
}
// 釋放內存
a.dispose();
b.dispose();
c.dispose();
好了,這樣一個完整的調用例子就結束了,我只是寫出了程序中的關鍵的代碼,具體的還需要寫一
個類,並且繼承一個基類,在復寫基類中的方法,這些都比較簡單,大家可以參考一下網上的其他
例子。
問題解答:
1.Java中調用指針類型的參數:需要創建Pointer變量,並為其分配空間
2.整形的數據可以直接傳入;
3.JNative對CString類型支持不是很良好,調用CString的方法時,經常會報一些異常,所以我把路徑改成
的字符指針;
4.輸入型參數作為輸出:可以參見以上的例子,數組c是如何設置和輸出的。