Java使用JNA调用C的DLL库

C代码,指定:生成dll动态库,生成出bl.dll动态库

#define _CRT_SECURE_NO_WARNINGS
#define STRICT                         /* WIN32 */
#include "binlog.h"                    /* BL    */
#include <tchar.h>                     /* RTL   */
#include <stdio.h>
#include <windows.h>
#include <time.h>

typedef struct Frame
{
	int chn;
	int id;
	int dlc;
	long long time;
	char* data;
} Frame;


/*创建文件*/
__declspec(dllexport) HANDLE createBLFFile(BYTE* fileName) {

	HANDLE hFile;
	LPCTSTR pFileName = _T((CHAR*)fileName);
	hFile = BLCreateFile(pFileName, GENERIC_WRITE);
	if (INVALID_HANDLE_VALUE == hFile)
	{
		return -1;
	}
	BLSetApplication(hFile, BL_APPID_CANCASEXLLOG, 1, 0, 1);
	return hFile;
}

/*创建文件*/
__declspec(dllexport) int closeBLFFile(HANDLE hFile) {
	BLCloseHandle(hFile);
	return 1;
}

/*写文件*/
__declspec(dllexport) void writeCanBLFFile(HANDLE hFile, Frame* frame, int len) {

	SYSTEMTIME systemTime;
	ULONGLONG i;
	VBLAppTrigger appTrigger;
	VBLCANMessage canMessage;
	VBLAppText appText;
	ULONGLONG time;

	// initialize all members to zero (including reserved space)
	memset(&appTrigger, 0, sizeof(VBLAppTrigger));
	memset(&canMessage, 0, sizeof(VBLCANMessage));

	/* setup object headers */
	/* 设置对象标题 */
	appTrigger.mHeader.mBase.mSignature = BL_OBJ_SIGNATURE;
	appTrigger.mHeader.mBase.mHeaderSize = sizeof(appTrigger.mHeader);
	appTrigger.mHeader.mBase.mHeaderVersion = 1;
	appTrigger.mHeader.mBase.mObjectSize = sizeof(VBLAppTrigger);
	appTrigger.mHeader.mBase.mObjectType = BL_OBJ_TYPE_APP_TRIGGER;
	appTrigger.mHeader.mObjectFlags = BL_OBJ_FLAG_TIME_ONE_NANS;

	canMessage.mHeader.mBase.mSignature = BL_OBJ_SIGNATURE;
	canMessage.mHeader.mBase.mHeaderSize = sizeof(canMessage.mHeader);
	canMessage.mHeader.mBase.mHeaderVersion = 1;
	canMessage.mHeader.mBase.mObjectSize = sizeof(VBLCANMessage);
	canMessage.mHeader.mBase.mObjectType = BL_OBJ_TYPE_CAN_MESSAGE;
	canMessage.mHeader.mObjectFlags = BL_OBJ_FLAG_TIME_ONE_NANS;


	for (i = 0; i < len; i++) {
		/* increment in milliseconds */
		time = frame[i].time;

		/* setup app trigger object header */
		appTrigger.mHeader.mObjectTimeStamp = time;
		/* write app trigger object */
		BLWriteObject(hFile, &appTrigger.mHeader.mBase);

		/* setup CAN object header */
		canMessage.mHeader.mObjectTimeStamp = time;
		/* setup CAN message */
		canMessage.mChannel = frame[i].chn;
		canMessage.mID = frame[i].id;
		canMessage.mFlags = 1;
		canMessage.mDLC = frame[i].dlc;

		memcpy(canMessage.mData, _T(frame[i].data), canMessage.mDLC);

		/* write CAN message */
		BLWriteObject(hFile, &canMessage.mHeader.mBase);
	}
	return 1;
}

Java代码

引入Mava坐标

        <dependency>
            <groupId>net.java.dev.jna</groupId>
            <artifactId>jna</artifactId>
            <version>4.5.1</version>
        </dependency>

JAVA测试代码 

package com.zr.JNA;

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.Structure;

import java.util.Arrays;
import java.util.List;

/**
 * @author qingtaiJiang
 * @date 2021/1/21 10:18
 */
public class BlJNA {

    public interface CLibrary extends Library {
        CLibrary INSTANCE = (CLibrary) Native.loadLibrary("bl.dll", CLibrary.class);

        Pointer createBLFFile(String fileName);

        int closeBLFFile(Pointer hFile);

        void writeCanBLFFile(Pointer hFile, Frame[] frames, int len);
    }

    public static class Frame extends Structure {
        //Structure子类中的公共字段的顺序,必须与C语言中的结构的顺序一致,否则会报错!
        public int chn;
        public int id;
        public int dlc;
        public long time;
        public String data;

        public static class ByReference extends Frame implements Structure.ByReference {
        }

        public static class ByValue extends Frame implements Structure.ByValue {
        }

        @Override
        protected List<String> getFieldOrder() {
            return Arrays.asList("chn", "id", "dlc", "time", "data");
        }
    }

    public static void main(String[] args) {
        Pointer blfFile = CLibrary.INSTANCE.createBLFFile("./testOne.blf");
        int len = 5;
        Frame[] frames = (Frame[]) new Frame().toArray(len);
        for (int i = 0; i < len; i++) {
            frames[i].chn = 1;
            frames[i].data = "12413234";
            frames[i].id = 0x001;
            frames[i].dlc = 8;
            frames[i].time = 134234;
        }
        CLibrary.INSTANCE.writeCanBLFFile(blfFile, frames, len);

        CLibrary.INSTANCE.closeBLFFile(blfFile);
    }
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值