天天看點

java調用C++/C的三種方式

Java調用C++/C有3中方式:JNI、JNA、JNative。

注:1、個人覺得還是JNA的方式最好。

2、Java和C++/C互動的難點在于資料結構的對應

3、java不可以直接調用C#代碼,C#代碼需要托管

JNI

(Android調用,普通java類似)使用步驟:

1、編寫靜态方法(用java聲明)

2、編譯生成class檔案

3、編譯生成h檔案

4、編寫C檔案(用C/C++實作)

5、配置NDK

6、配置so庫

7、在Activity調用(Java調用C/C++)。

JNative

使用步驟:

1、下載下傳Jnative.jar,下載下傳位址如下:

  ​​​http://nchc.dl.sourceforge.net/sourceforge/jnative/JNative.jar​​​   把JNativeCpp.dll放在c:\windows\system32目錄下;把要調用的dll檔案也放在c:\windows\system32目錄下。

2、編碼調用dll,示例如下:

JNative jnative = new JNative(dllNmae,"disConnect");  //調用a.dll中disconnect方法
jnative.setRetVal(Type.INT);  //設定傳回類型為int,也可以設定為float,string等類型
int pindex = 0;
jnative.setParameter(pindex++, hHandle);  //設定第一個參數為hHandle
jnative.invoke();  //正式執行這個函數
return jnative.getRetValAsInt();  //設定傳回值為int,并傳回      

JNA

使用步驟:

1、下載下傳 jna-x.x.x.jar放入到java項目類路徑下;

2、建立一個接口繼承Library;

3、聲明方法,方法的傳回值和參數要和本地dll對應;

4、執行個體化接口執行個體;

5、調用接口;

//1、建立接口
public interface CSIInterface extends Library {
     //2、聲明方法
     public Boolean CreateCsiInstance(int deviceId, Boolean bSquelchLogging);
}
//3、執行個體化接口
public CSIInterface instance = (CSIInterface) Native.loadLibrary(
      "macitcsi.dll", CSIInterface.class);
//4、調用接口
instance.CreateCsiInstance(4,true);      

使用注意點:

1、dll的位數要和JDK的位數一緻;

2、Java和C的資料類型對應關系如下,和C++的資料類型可以通過C為中轉:

java調用C++/C的三種方式
java調用C++/C的三種方式