Java调用C/C++ DLL库的方法

最近公司项目中需要调用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();
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值