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);
}
}