一、 工作环境
1. windows (64位), JDK (64位),dll文件 (64位)
2. Linux (64位), JDK (64位),so文件 (64位)
3. JNA的官方资源路径为https://github.com/twall/jna/
二、 实际操作
调用的方法中输出wchar_t** ,即取wchar_t**指向的值,它可以代表二种结果值:
(1)它就是一个宽字符串;
(2)它代表一个缓冲字节数组,直接去获取字节数组。在这种情况下,取字节数组的长度length时要注意操作系统,根据我实际开发中,在 windows (64位)中一个宽字符对应2个字节长度,在Linux (64位)一个宽字符对应4个字节长度。
下面分别针对上面的(1) (2) 进行代码演示:
(1)它就是一个宽字符串;
1.在cf.h头文件有如下申明:采用C语言形式接口函数
extern "C"
{
/*
功能 : 获取识别结果
输出参数 xml_result 识别结果字符串,xml格式
*/
Public int IdentifyEnd (wchar_t **xml_result);
}
2. Java调用代码:接口CFJna.java
package cn.jna.test;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.ptr.PointerByReference;
public interface CFJna extends Library {
//加载动态资源库
CFJna library = (CFJna) Native.loadLibrary("TestCF", CFJna.class);
//定义要调用的方法,与cf.h头文件中定义的函数名一样
int IdentifyEnd (PointerByReference xml_result);
}
3. 测试调用:CFJnaTest.java
package cn.jna.test;
import com.sun.jna.ptr.PointerByReference;
public class CFJnaTest {
public static void main(String[] args) {
PointerByReference xml_result= new PointerByReference();
int idetify = CFJna.library.IdnetifyEnd(xml_result);
//取出结果
String result = xml_result.getValue().getWideString(0);
System.out.println("result:"+result);
}
}
(2)它代表一个缓冲字节数组,直接去获取字节数组
1.在cf.h头文件有如下申明:采用C语言形式接口函数
extern "C"
{
/*
功能 : 获取模型
输出参数 model_ids id集合缓冲区
输出参数 model_ids_len id集合缓冲区长度
*/
Public int GetModel( wchar_t** model_ids, int* model_ids_len);
}
2. Java调用代码:接口CFJna.java
package cn.jna.test;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.ptr.IntByReference;
import com.sun.jna.ptr.PointerByReference;
public interface CFJna extends Library {
//加载动态资源库
CFJna library = (CFJna) Native.loadLibrary("TestCF", CFJna.class);
//定义要调用的方法,与cf.h头文件中定义的函数名一样
int GetModel(PointerByReference model_ids,IntByReference model_ids_len);
}
3. 测试调用:CFJnaTest.java
package cn.jna.test;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import com.sun.jna.ptr.IntByReference;
import com.sun.jna.ptr.PointerByReference;
public class CFJnaTest {
public static void main(String[] args) {
PointerByReference model_ids= new PointerByReference();
IntByReference model_ids_len = new IntByReference();
int getModel = CFJna.library.GetModel(model_ids, model_ids_len);
System.out.println("getModel:"+getModel);
//
int len = model_ids_len.getValue();
//区分如下
// 如果在windows 64 这个样取字节数组
/*byte[] byteArray_windows = model_ids.getValue().getByteArray(0, len*2); //它的数据如:[41, 89, 20, 108, ......]
//假设取前50个字节代表一个id,
byte[] idArray_windows = Arrays.copyOfRange(byteArray_windows, 0, 50);
try {
String id_windows = new String(idArray_windows,"UTF-16LE");//
System.out.println("id_windows:"+id_windows);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
// 如果在linux 64 这个样取字节数组
byte[] byteArray_linux = model_ids.getValue().getByteArray(0, len*4);
//byteArray_linux 它的数据如:[41, 89, 0, 0, 20, 108, 0, 0, ......]
//假设取前100个字节代表一个id,
byte[] idArray_linux = Arrays.copyOfRange(byteArray_linux, 0, 100);
try {
String id_linux = new String(idArray_linux,"UTF-16LE").replaceAll("\0", "");// 替换掉两个0,即表示的空白字符
System.out.println("id_linux:"+id_linux);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
收尾: 请继续关注,或关注我的新浪微博:微博Abel