最近公司项目中需要调用RD6数据库,但是不能直接调用,需要调用第三方动态库(DLL),调用DLL文件有几种常见的方式:Jnative调用dll,jna调用dll,jni调用dll.对于一个不懂C/C++的程序员来说,使用jna会比较简单一点.
使用jna调用dll文件需要两个jar包
package com.zknw.task.influxdb;
import com.sun.jna.*;
import com.sun.jna.ptr.FloatByReference;
import com.zknw.task.model.InfluxDB;
import org.apache.log4j.Logger;
import java.util.ArrayList;
import java.util.List;
public class ReadRd6 {
private static final Logger logger = Logger.getLogger(ReadRd6.class);
private String addr = "127.0.0.1";
private int port = 9999;
public void execute() throws Exception{
try {
this.connection();
}
catch (Exception e){
System.out.println(e);
}
}
public interface CLibrary extends Library {
// DLL文件默认路径为项目根目录,若DLL文件存放在项目外,请使用绝对路径。(此处:(Platform.isWindows()?"rd6api":"c")指本地动态库rd6api.dll)
ReadRd6.CLibrary INSTANCE = (ReadRd6.CLibrary) Native.loadLibrary((Platform.isWindows() ? "rd6api" : "c"), ReadRd6.CLibrary.class);
// 声明将要调用的DLL中的方法,可以是多个方法(此处示例调用本地动态库rd6api.dll中的dbcnt_connect()方法)
//连接数据库
int dbcnt_connect(String addr, int port);
//写入数据
int rd6sn_putsnapshot(int pt, float value, int istat, int timestamp);
//读取数据
int rd6sn_getsnapshots(int[] pt, FloatByReference value, int[] istat, int[] timestamp, int num);
//断开数据库连接
int dbcnt_disconnect();
}
private void connection() throws Exception {
try {
//数据库连接
int i = ReadRd6.CLibrary.INSTANCE.dbcnt_connect(addr, port);
if (i == 0) {
//读取数据
int[] name = {101, 102, 103};
int[] status = {192, 192, 192};
int[] time = {1548227880, 1548227894, 1548227910};
FloatByReference p_Data = new FloatByReference();
Memory mymem = new Memory(name.length*4);
p_Data.setPointer(mymem);
ReadRd6.CLibrary.INSTANCE.rd6sn_getsnapshots(name, p_Data, status, time, name.length);
float[] DB = new float[name.length];
mymem.read(0, DB, 0, name.length);
//释放Memory内存
long peer = Pointer.nativeValue(mymem);
Native.free(peer);
Pointer.nativeValue(mymem, 0);
//写入数据
ReadRd6.CLibrary.INSTANCE.rd6sn_putsnapshot(110, 152, 1548000000, 192);
//断开数据库连接
ReadRd6.CLibrary.INSTANCE.dbcnt_disconnect();
}
}catch(Exception ex){
ex.printStackTrace();
}
finally {
//释放内存
NativeLibrary.disposeAll();
}
}
}