Java 呼叫 C/C++ 之 JNA 系列實戰篇 —— 輸出char * (六)
阿新 • • 發佈:2019-01-06
一、 工作環境
1. windows (64位), JDK (64位),dll檔案 (64位)
2. Linux (64位), JDK (64位),so檔案 (64位)
二、 實際操作
1.在cf.h標頭檔案有如下申明:採用C語言形式介面函式
extern "C" { /* 功能 : 獲取版本資訊 輸出引數 result 結果 輸出引數 resultlength 結果長度 */ Public int GetVersionInfo(char* result, int* resultlength); }
2. Java呼叫程式碼:介面CFJna.java
package cn.vx.test; import com.sun.jna.Library; import com.sun.jna.Native; import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; public interface CFJna extends Library { CFJna library = (CFJna) Native.loadLibrary("TestCF", CFJna.class); int GetVersionInfo(Pointer result, IntByReference resultLength); }
3. 測試呼叫:CFJnaTest.java
package cn.vx.test; import com.sun.jna.Memory; import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; public class CFJnaTest { public static void main(String[] args) { //配置引數 Pointer resultv = Pointer.NULL; //char* resul 指定一個空指標 IntByReference resultLength = new IntByReference(); //int* resultlength //呼叫兩次,第一次獲取結果的長度 // 第二次再根據長度去獲取位元組陣列 int getVersionInfo = CFJna.library.GetVersionInfo(resultv, resultLength); System.out.println("getVersionInfo:"+getVersionInfo); if(getVersionInfo == SUCCESS) {//表示獲取成功 //第一次獲取結果的長度 int vesionLen = resultLength.getValue(); System.out.println("versionLen:"+vesionLen); //第二次再根據長度去獲取位元組陣列 resultv = new Memory(vesionLen); getVersionInfo = CFJna.library.GetVersionInfo(resultv, resultLength); System.out.println("getVersionInfo:"+getVersionInfo); //獲取位元組陣列 byte[] byteArray = resultv.getByteArray(0, vesionLen); //轉化成字元 System.out.println(new String(byteArray,"GB2312")); } } }
收尾: 請繼續關注,或關注我的新浪微博:微博Abel