程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java調用Dll是方法中存在指針或變參的解決方法

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

編輯:關於JAVA

假設我有一個叫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是如何設置和輸出的。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved