一、 工作環境
1. windows (64位), JDK (64位),dll文件 (64位)
2. Linux (64位), JDK (64位),so文件 (64位)
3. JNA的官方資源路徑為https://github.com/twall/jna/
二、 實際操作
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"));
- }
- }
- }
- 原文: http://blog.csdn.net/blog_abel/article/details/31404597