zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    将一个dropdownlist从一个div复制到另一个div
    【转】AOP 那点事儿(续集)
    【转】AOP 那点事儿
    spring 简单配置
    spring 基础原理
    jvm简介
    jre、jdk和jvm的关系
    【转】Jvm工作原理
    servlet简述
    Filter简述
  • 原文地址:https://www.cnblogs.com/jiftle/p/7009711.html
Copyright © 2011-2022 走看看