Java調用Dll存在指針或變參的解決方法

[導讀]假設我有一個叫test.dll的動態庫,其中有一個函數如下。

 企業軟件熱點文章

 釋放Linux磁盤空間方法  輕鬆破除windows XP開機密碼自有妙招

 

  假設我有一個叫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 <="">

 

  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是如何設置和輸出的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章