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. }  

文章转载 :

Java 调用 C/C++ 之 JNA 系列实战篇

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值