代码如下:
生成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++里面的结构体相对应