JNA调用c++动态库返回数据

news2024/11/24 18:43:53

jna学习网站

JNA Examples 

1、返回String,  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 intervalP;
    //停车告警频率
    int intervalC;
    //应急车道告警频率
    int intervalR;
    //视频流地址
    char* videoUrl;
    //结果请求地址
    char* resultUrl;
    //无人机id
    char* deviceId;
    //控制文件绝对路径  有则算法开始输出
    char* startFile;
};

EXPORT char* startVideoAi(VideoAiReq videoAiReq);

#endif //PCH_H

pch.cpp代码

// pch.cpp: 与预编译标头对应的源文件

#include "pch.h"
#include "iostream"

char* startVideoAi(VideoAiReq videoAiReq) {
	std::cout << videoAiReq.deviceId << std::endl;
	std::cout << videoAiReq.startFile << std::endl;
	std::cout << videoAiReq.intervalP << std::endl;
	std::cout << videoAiReq.videoUrl << std::endl;
	std::cout << videoAiReq.resultUrl << std::endl;
	std::cout << videoAiReq.intervalC << std::endl;
	std::cout << videoAiReq.intervalR << std::endl;
	return videoAiReq.startFile;
}

// 当使用预编译的头时,需要使用此源文件,编译才能成功。

编译成动态库 videoai1

java代码如下

VideoAiLibrary.java 动态库
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 = "videoai1";
    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>
     */
    String startVideoAi(VideoAiReq videoAiReq);
}

传参实体类

package com.pojo.util;

import com.sun.jna.Structure;

/**
 * 属性顺序和c++代码一致
 */
@Structure.FieldOrder({"intervalP", "intervalC", "intervalR", "videoUrl", "resultUrl", "deviceId", "startFile"})
public class VideoAiReq extends Structure {

    /**
     * 行人告警频率
     */
    public int intervalP;
    /**
     * 停车告警频率
     */
    public int intervalC;

    /**
     * 应急车道告警频率
     */
    public int intervalR;
    /**
     * 视频流地址
     */
    public String videoUrl;
    /**
     * 结果请求地址
     */
    public String resultUrl;
    /**
     * 无人机id
     */
    public String deviceId;
    /**
     * 控制文件绝对路径  有则算法开始输出
     */
    public String startFile;

    public int getIntervalP() {
        return intervalP;
    }

    public void setIntervalP(int intervalP) {
        this.intervalP = intervalP;
    }

    public int getIntervalC() {
        return intervalC;
    }

    public void setIntervalC(int intervalC) {
        this.intervalC = intervalC;
    }

    public int getIntervalR() {
        return intervalR;
    }

    public void setIntervalR(int intervalR) {
        this.intervalR = intervalR;
    }

    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() {
    }


}

测试类 和测试结果

package com.pojo.util;


import lombok.SneakyThrows;

import java.io.File;
import java.nio.ByteBuffer;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class JnaTest {

    @SneakyThrows
    public static void main(String[] args) {
        VideoAiReq videoAiReq = new VideoAiReq();
        videoAiReq.setIntervalP(10);
        videoAiReq.setIntervalC(20);
        videoAiReq.setIntervalR(30);
        videoAiReq.setVideoUrl("videoUrl");
        videoAiReq.setStartFile("startFile");
        videoAiReq.setDeviceId("deviceId");
        videoAiReq.setResultUrl("resultUrl");

        String ss = VideoAiLibrary.INSTANCE.startVideoAi(videoAiReq);
        System.out.println("return===" + ss);
//        Path newFile = Paths.get("D:\\home\\smart\\newfile.txt");
//        if (!Files.exists(newFile)) {
//            Files.createFile(newFile);
//        }
//        Files.deleteIfExists(newFile);

    }
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2220357.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软考攻略/超详细/系统集成项目管理工程师/基础知识分享18

6.5数据分析及应用 6.5.1 数据集成&#xff08;掌握&#xff09; 数据集成就是将驻留在不同数据源中的数据进行整合&#xff0c;向用户提供统一的数据视图&#xff0c;使得用户能以透明的方式访问数据。 WebServices技术是一个面向访问的分布式计算模型&#xff0c;它的本质是…

Nature 正刊丨空间蛋白质组学确定JAKi是一种致命皮肤病的治疗方法

01摘要 中毒性表皮坏死松解症&#xff08;TEN&#xff09;是一种由常见药物引发的致命药物性皮肤反应&#xff0c;是一个新出现的公共卫生问题1,2,3。TEN患者会因角质形成细胞死亡而发生严重和突然的表皮脱离。尽管已经提出了驱动角质形成细胞死亡的分子机制&#xff0c;但主要…

10.21 IO进程直接的通信

1、用消息队列实现两个进程直接的通信 先输入的代码 #include<myhead.h> //定义消息列队的结构体 struct msgbuf {long mtype; //消息类型char mtext[1024]; //消息正文 };//宏定义正文的大小 #define MSGSZ (sizeof(struct msgbuf) - sizeof(long))//定义回收僵尸信号…

Linux第一讲:Linux基本指令

Linux第一讲&#xff1a;Linux基本指令 1.Linux发展历史2.先快速了解一些指令3.指令 -- ls3.1知识点1 -- 文件属性3.1.1详细解析ls指令3.1.1.1 ls3.1.1.2 ls -l 、ls -a3.1.1.2.1 ls -l3.1.1.2.2 ls -a3.1.1.2.3 ls -la 3.1.1.3其它指令 3.2知识点2 -- 什么是.和..3.3知识点3 -…

手写模拟Spring的基本功能

文章目录 1. Spring的基本功能2. 容器启动 容器启动&#xff0c;即创建容器对象并赋予配置对象3. BeanDefinition扫描4. Bean的生命周期5. 单例Bean与多例Bean6. 依赖注入7. AOP8. Aware 回调9. 初始化10. BeanPostProcessor附录&#xff1a; 1. Spring的基本功能 2. 容器启动 …

【鸡翅Club】项目启动

一、项目背景 这是一个 C端的社区项目&#xff0c;有博客、交流&#xff0c;面试学习&#xff0c;练题等模块。 项目的背景主要是我们想要通过面试题的分类&#xff0c;难度&#xff0c;打标&#xff0c;来评估员工的技术能力。同时在我们公司招聘季的时候&#xff0c;极大的…

mingw64的Windows安装及配置教程gcc、g++等

mingw64.rar 链接&#xff1a;https://pan.baidu.com/s/18YrDRyi5NHtqnTwhJG6PuA 提取码&#xff1a;pbli &#xff08;免费永久有效&#xff0c;免安装&#xff0c;解压后配置环境变量即可使用&#xff09; 1 下载 解压后随便放到一个地方&#xff1a; 复制“bin”路径&am…

SpringCloudAlibaba[Nacos]注册配置中心注册与发现服务

Nacos的全称是Dynamic Naming and Configuration Service&#xff0c;Na为naming/nameServer即注册中心,co为configuration即注册中心&#xff0c;service是指该注册/配置中心都是以服务为核心。是阿里巴巴开源易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nac…

安装vue发生异常:npm ERR! the command again as root/Administrator.

一、异常 npm ERR! The operation was rejected by your operating system. npm ERR! Its possible that the file was already in use (by a text editor or antivirus), npm ERR! or that you lack permissions to access it. npm ERR! npm ERR! If you believe this might b…

【LeetCode:910. 最小差值 II + 模拟 + 思维】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

html,css,js实现Upload 上传

实现效果&#xff1a; 代码实现&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Docum…

基于Multisim的汽车尾灯控制电路设计与仿真

假设汽车尾部左右量测各有3个指示灯&#xff08;用发光二极管模拟&#xff09;1. 汽车正常运行时指示灯全灭&#xff1b;2.右转弯时&#xff0c;右侧3个指示灯按右循环顺序点亮&#xff1b;.3. 左转弯时&#xff0c;左侧3个指示灯按左循环顺序点亮&#xff1b;4.临时刹车时所有…

【C语言刷力扣】910.最小差值 ||

题目&#xff1a; 解题思路; 由于需要对数组中的每一个进行 k 或 -k 的操作&#xff0c;这时要求最小差值&#xff0c;即对较大的数 -k 对较小的数 k。 需要先对数组进行排序&#xff0c;再枚举对元素的操作。 对 nums[0] 到 nums[i - 1] 的数进行 k对 nums[i] 到 nums[numsS…

Java笔试05

在Java中&#xff0c;final 关键字可以用于修饰类、方法和变量&#xff1a; 修饰类&#xff1a; 被 final 修饰的类不能被继承&#xff0c;即不能有子类。这通常用于工具类或者不希望被扩展的类。 修饰方法&#xff1a; 被 final 修饰的方法不能被子类覆盖。这通常用于确保类…

Yolo目标检测:实时性与准确性的完美结合

在目标检测领域&#xff0c;Yolo&#xff08;You Only Look Once&#xff09;算法无疑是一颗璀璨的明星。自2016年由Joseph Redmon等人提出以来&#xff0c;Yolo凭借其出色的实时性和准确性&#xff0c;迅速在多个应用场景中崭露头角。本文将详细介绍Yolo目标检测的基本原理、优…

Qt学习笔记第21到30讲

第21讲 new/delete关键字 new关键字 在 C 中&#xff0c; new 关键字用于动态分配内存。它是 C 中处理动态内存分配的主要工具之一&#xff0c;允许在程序运行时根据需要分配内存。 用法 ①分配单个对象&#xff1a;使用 new 可以在堆上动态分配一个对象。例如&#xf…

面向对象进阶(上)(JAVA笔记第二十二期)

p.s.这是萌新自己自学总结的笔记&#xff0c;如果想学习得更透彻的话还是请去看大佬的讲解 目录 static修饰符静态变量静态方法 工具类工具类的使用例子第一题第二题 static注意事项继承关系建立继承关系的格式继承的好处及使用场景继承的特点继承体系的设计继承中类的三大要素…

JavaWeb 22.Node.js_简介和安装

有时候&#xff0c;后退原来是向前 —— 24.10.7 一、什么是Node.js Node.js 是一个于 Chrome V8 的 JavaScript 运行时环境&#xff0c;可以使 JavaScript 运行在服务器端。使用 Node.js&#xff0c;可以方便地开发服务器端应用程序&#xff0c;如 Web 应用、API、后端服务&a…

使用Three.js和Force-Directed Graph实现3D知识图谱可视化

先看样式&#xff1a; 在当今信息爆炸的时代&#xff0c;如何有效地组织和展示复杂的知识结构成为一个重要的挑战。3D知识图谱可视化是一种直观、交互性强的方式来呈现知识之间的关系。本文将详细介绍如何使用HTML、JavaScript、Three.js和Force-Directed Graph库来实现一个交互…

基于SpringBoot+Vue+uniapp微信小程序的社区门诊管理系统的详细设计和实现(源码+lw+部署文档+讲解等)

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…