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為中轉:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5yN1MTNzkTOjNGZ2QjMjJzMzYzX4MDOycTM3IzLclDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)