jna调用c++ 动态库 结构体传参分为值传递、引用传递(指针传递)
1、用Visual Studio创建动态链接库项目
Visual Studio导出动态库_vs导出动态库-CSDN博客
2、pch.h头文件内容如下
// pch.h: 这是预编译标头文件。
// 下方列出的文件仅编译一次,提高了将来生成的生成性能。
// 这还将影响 IntelliSense 性能,包括代码完成和许多代码浏览功能。
// 但是,如果此处列出的文件中的任何一个在生成之间有更新,它们全部都将被重新编译。
// 请勿在此处添加要频繁更新的文件,这将使得性能优势无效。
#ifndef PCH_H
#define PCH_H
// 添加要在此处预编译的标头
#include "framework.h"
#ifdef __cplusplus
#define EXPORT extern "C" __declspec(dllexport)
#else
#define EXPORT __declspec(dllexport)
#endif
struct VideoAiReq {
int interval;
char* videoUrl;
char* resultUrl;
char* deviceId;
char* startFile;
};
EXPORT void startVideoAi(VideoAiReq videoAiReq);
#endif //PCH_H
3、pch.cpp内容如下
// pch.cpp: 与预编译标头对应的源文件
#include "pch.h"
#include "iostream"
void startVideoAi(VideoAiReq videoAiReq) {
std::cout << videoAiReq.deviceId << std::endl;
std::cout << videoAiReq.startFile << std::endl;
std::cout << videoAiReq.interval << std::endl;
std::cout << videoAiReq.videoUrl << std::endl;
std::cout << videoAiReq.resultUrl << std::endl;
}
// 当使用预编译的头时,需要使用此源文件,编译才能成功。
4、生成动态库 右键项目根目录
选择 属性
选择如下
生成动态库
5、把生成的动态库复制到 C:\Windows\System32
6、java代码如下,实体类
VideoAiReq.java
package com.pojo.util;
import com.sun.jna.Structure;
/**
* 属性顺序和c++代码一致
*/
@Structure.FieldOrder({"interval", "videoUrl", "resultUrl", "deviceId", "startFile"})
public class VideoAiReq extends Structure {
public int interval;
public String videoUrl;
public String resultUrl;
public String deviceId;
public String startFile;
public int getInterval() {
return interval;
}
public void setInterval(int interval) {
this.interval = interval;
}
public String getVideoUrl() {
return videoUrl;
}
public void setVideoUrl(String videoUrl) {
this.videoUrl = videoUrl;
}
public String getResultUrl() {
return resultUrl;
}
public void setResultUrl(String resultUrl) {
this.resultUrl = resultUrl;
}
public String getDeviceId() {
return deviceId;
}
public void setDeviceId(String deviceId) {
this.deviceId = deviceId;
}
public String getStartFile() {
return startFile;
}
public void setStartFile(String startFile) {
this.startFile = startFile;
}
public VideoAiReq(int interval, String videoUrl, String resultUrl, String deviceId, String startFile) {
this.interval = interval;
this.videoUrl = videoUrl;
this.resultUrl = resultUrl;
this.deviceId = deviceId;
this.startFile = startFile;
}
public VideoAiReq() {
}
}
7、加载类库代码
package com.pojo.util;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.NativeLibrary;
import java.nio.ByteBuffer;
/**
* JNA Wrapper for library <b>mycpp3</b><br>
* This file was autogenerated by <a href="http://jnaerator.googlecode.com/">JNAerator</a>,<br>
* a tool written by <a href="http://ochafik.com/">Olivier Chafik</a> that <a href="http://code.google.com/p/jnaerator/wiki/CreditsAndLicense">uses a few opensource projects.</a>.<br>
* For help, please visit <a href="http://nativelibs4java.googlecode.com/">NativeLibs4Java</a> , <a href="http://rococoa.dev.java.net/">Rococoa</a>, or <a href="http://jna.dev.java.net/">JNA</a>.
*/
public interface VideoAiLibrary extends Library {
public static final String JNA_LIBRARY_NAME = "videoai";
public static final VideoAiLibrary INSTANCE = (VideoAiLibrary) Native.load(VideoAiLibrary.JNA_LIBRARY_NAME, VideoAiLibrary.class);
/**
* Original signature : <code>void startVideoAi(char*, char*, char*, char*, int)</code><br>
* <i>native declaration : C:\Users\Administrator\mycpp3.h:6</i>
*/
void startVideoAi(VideoAiReq videoAiReq);
}
8、测试代码运行如下
package com.pojo.util;
import lombok.SneakyThrows;
import java.nio.ByteBuffer;
public class JnaTest {
@SneakyThrows
public static void main(String[] args) {
VideoAiReq videoAiReq = new VideoAiReq();
videoAiReq.setInterval(10);
videoAiReq.setVideoUrl("videoUrl");
videoAiReq.setStartFile("startFile");
videoAiReq.setDeviceId("deviceId");
videoAiReq.setResultUrl("resultUrl");
VideoAiLibrary.INSTANCE.startVideoAi(videoAiReq);
}
}