Jna调用c++动态库传实体类

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

猜你喜欢

转载自blog.csdn.net/zsj777/article/details/142979243