java呼叫C++/C的三種方式
阿新 • • 發佈:2018-12-03
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對應回撥。