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
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
相关文章推荐
- Java 调用 C/C++ 之 JNA 系列实战篇 —— 输出char * (六)
- Java 调用 C/C++ 之 JNA 系列实战篇 —— 输出wchar_t* (三)
- Java 调用 C/C++ 之 JNA 系列实战篇 —— 输入char * (五)
- Java 调用 C/C++ 之 JNA 系列实战篇 —— 输出char *
- Java 调用 C/C++ 之 JNA 系列实战篇 —— 输出wchar_t** (四)
- Java 调用 C/C++ 之 JNA 系列实战篇 —— 起步 (一)
- Java 调用 C/C++ 之 JNA 系列实战篇 —— 权威Examples推荐
- Java 调用 C/C++ 之 JNA 系列实战篇 —— 起步 (一)
- Java 调用 C/C++ 之 JNA 系列实战篇 —— 输入wchar_t* (二)
- 实战c++中的string系列--string与char*、const char *的转换(data() or c_str())
- JNA:JAVA调用DLL 超详细代码实战
- windows/linux + java + jna + dll/so 调用C/C++
- Java 通过 JNA 调用 DLL 返回 char * 字符串乱码问题的解决
- JNA实现Java调用C++动态链接库
- [JNA系列]Java调用Delphi编写的Dll之Delphi与JAVA基本数据类型对比
- 实战c++中的string系列--string与char*、const char *的转换(data() or c_str())
- JNA java调用c/c++代码
- Atitit.java jna 调用c++ dll 的总结
- JNI学习系列——在C/C++中调用JAVA
- java 用JNA方法调用C++动态链接库