您的位置:首页 > 编程语言 > C语言/C++

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

2017-06-14 16:46 751 查看
一、 工作环境

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

extern "C"

{

/*

功能 : 获取版本信息

输出参数 result 结果

输出参数 resultlength 结果长度

*/

Public int GetVersionInfo(char* result, int* resultlength);

}

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

[java] view plain copy

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

[java] view plain copy

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: