Java 调用 C/C++ 之 JNA 系列实战篇 —— 输出char * (六)

一、 工作环境

            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语言形式接口函数

 

[cpp] view plain copy
 
  1. extern "C"    
  2. {    
  3.     
  4. /*  
  5. 功能 :      获取版本信息  
  6. 输出参数    result         结果 
  7. 输出参数    resultlength   结果长度 
  8. */    
  9. Public int GetVersionInfo(char* result, int* resultlength);   
  10.     
  11. }  


         2. Java调用代码:接口CFJna.java

 

 

[java] view plain copy
 
  1. package cn.vx.test;  
  2.   
  3.   
  4. import com.sun.jna.Library;  
  5. import com.sun.jna.Native;  
  6. import com.sun.jna.Pointer;  
  7. import com.sun.jna.ptr.IntByReference;  
  8.   
  9. public interface CFJna extends Library {  
  10.   
  11.     CFJna library = (CFJna) Native.loadLibrary("TestCF", CFJna.class);  
  12.       
  13.     int GetVersionInfo(Pointer result, IntByReference resultLength);  
  14. }  


         3. 测试调用:CFJnaTest.java

 

 

[java] view plain copy
 
    1.     package cn.vx.test;  
    2.   
    3. import com.sun.jna.Memory;  
    4. import com.sun.jna.Pointer;  
    5. import com.sun.jna.ptr.IntByReference;  
    6.   
    7. public class CFJnaTest {  
    8.   
    9.     public static void main(String[] args) {  
    10.   
    11.         //配置参数  
    12.         Pointer resultv = Pointer.NULL; //char* resul 指定一个空指针  
    13.         IntByReference resultLength = new IntByReference(); //int* resultlength  
    14.   
    15.         //调用两次,第一次获取结果的长度  
    16.         //          第二次再根据长度去获取字节数组  
    17.         int getVersionInfo = CFJna.library.GetVersionInfo(resultv, resultLength);  
    18.         System.out.println("getVersionInfo:"+getVersionInfo);  
    19.           
    20.         if(getVersionInfo == SUCCESS) {//表示获取成功  
    21.             //第一次获取结果的长度  
    22.             int vesionLen = resultLength.getValue();  
    23.             System.out.println("versionLen:"+vesionLen);  
    24.               
    25.             //第二次再根据长度去获取字节数组  
    26.             resultv = new Memory(vesionLen);  
    27.             getVersionInfo = CFJna.library.GetVersionInfo(resultv, resultLength);  
    28.             System.out.println("getVersionInfo:"+getVersionInfo);  
    29.   
    30.             //获取字节数组  
    31.             byte[] byteArray = resultv.getByteArray(0, vesionLen);  
    32.             //转化成字符  
    33.             System.out.println(new String(byteArray,"GB2312"));  
    34.         }  
    35.     }  
    36.   
    37. }
  1. 原文: http://blog.csdn.net/blog_abel/article/details/31404597
posted @ 2017-06-14 16:46  jiftle  阅读(5306)  评论(0编辑  收藏  举报