1. 程式人生 > >java呼叫C++/C的三種方式

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為中轉:

在這裡插入圖片描述
3、常用記錄:com.sun.jna.Structure對應結構體,com.sun.jna.Callback對應回撥。