JNA实战(二)—— 使用结构体

代码如下:

生成dll文件的c++代码:

// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"
#include<iostream>
using namespace std;


extern "C" {

	_declspec(dllexport) struct Vix_QueryInfoParam
	{
		void* bebpic;
		void* begtime;
		void* endtime;
		int recordtype;
		int source;
		void* channelno;
		int protocolType;
	};
	_declspec(dllexport) void reference(Vix_QueryInfoParam structor)
	{
		cout << structor.source << endl;
		cout << endl;
	};

	_declspec(dllexport) Vix_QueryInfoParam CreateStructor() {
		struct Vix_QueryInfoParam test1;
		test1.recordtype = 1;
		test1.source = 0;
		return test1;
	}

	_declspec(dllexport) Vix_QueryInfoParam JudgeIsStructed(Vix_QueryInfoParam structor) {
		cout << structor.source << endl;
		struct Vix_QueryInfoParam  s;
		s.source = 8;
		return s;
	}

}

java代码:

UserDStruct.java:

import com.sun.jna.Pointer;
import com.sun.jna.Structure;
import java.util.Arrays;
import java.util.List;

public class UserDStruct extends Structure {
    public static class ByReference extends UserDStruct implements Structure.ByReference {}
    public static class ByValue extends UserDStruct implements Structure.ByValue {}
    public Pointer bebpic;
    public Pointer begtime;
    public Pointer endtime;
    public int recordtype;
    public int source;
    public Pointer channelno;
    public int protocolType;
@Override
    protected List<String> getFieldOrder() {
    return Arrays.asList(new String[] {"bebpic","begtime","endtime","recordtype","source","channelno","protocolType"});
}
}

 test1.java:

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


public class test1 {
    public interface CLibrary extends Library {
        CLibrary INSTANCE = Native.load("D:\\java\\bin\\PRACTICE_DLL\\x64\\Debug\\PRACTICE_DLL.dll", CLibrary.class);
        UserDStruct.ByValue JudgeIsStructed(UserDStruct.ByValue structor);
        void reference(UserDStruct.ByReference structor);
    }

    public static void main(String[] args) {
        UserDStruct.ByValue struct = new UserDStruct.ByValue();
        struct.source = 1;
        UserDStruct.ByReference ref = new UserDStruct.ByReference();
        ref.source = 6;
        CLibrary.INSTANCE.reference(ref);
        UserDStruct.ByValue res = CLibrary.INSTANCE.JudgeIsStructed(struct);
        System.out.println(res.source);
    }
}

 能看懂代码的兄弟直接复制粘贴去验证使用,没那么清楚的话,我来解释一下:

我们首先要编写c++的代码 ,将里面的结构体和方法编写出来后导出,然后在Java里面首先写一个结构体类用来作为c++里面结构体的映射(这样的话,在java里面调用方法使用结构体的时候c++那边接收结构体时才能对应接收),最后在启动类里面实例dll、声明函数方法之后,在main方法里调用即可

注意点:

1.dll方法的基础使用(http://t.csdnimg.cn/iOOTj

2.在结构体类里面ByReference、ByValue两个类和getFieldOrder()是必须的,其中ByReference只能用于传入、ByValue在传入和接收都行,getFieldOrder方法是用来使结构体的属性跟c++里面的结构体顺序保持一致

3.UserDStruct.ByValue和UserDStruct.ByReference均与Vix_QueryInfoParam这个c++里面的结构体相对应

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

起飞001

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值