JNA基础使用,调用C++返回结构体

news/2025/2/26 17:14:41

C++端

test.h文件

#pragma once

struct RespInfo
{
    char* path;
    char* content;
    int statusCode;
};

extern "C" {
DLL_EXPORT void readInfo(char* path, RespInfo* respInfo);
}

test.cpp文件

#include "test.h"

void readInfo(char* path, RespInfo* respInfo)
{
    std::string res = "my resp content";
    char* resChar = new char [res.length() + 1];
    strcpy(resChar, res.c_str());
    int statusCode = 111;

    respInfo->path = path;
    respInfo->content = resChar;
    respInfo->statusCode = statusCode;
}

编写出DLL后,放到指定目录供JAVA加载调用。

Java端

  1. 定义库加载类
package org.demo.apptest1.jnatest;

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


public interface ExportFuncLib extends Library {
    ExportFuncLib INSTANCE = Native.load(Platform.isWindows() ? "D:\\Test.dll" : "/usr/lib/test.so", ExportFuncLib.class);


    void readInfo(String path, MyStruct myStruct);
}
  1. 定义结构体接收C++返回
package org.demo.apptest1.jnatest;

import com.sun.jna.Structure;

import java.util.ArrayList;
import java.util.List;

public class MyStruct extends Structure {
    public String path;
    public String content;
    public int statusCode;

    @Override
    protected List<String> getFieldOrder() {
        List<String> field = new ArrayList<>();
        field.add("path");
        field.add("content");
        field.add("statusCode");
        return field;
    }

    // 添加一个内部类,实现Structure.ByReference接口,用于通过引用传递
    public static class ByReference extends MyStruct implements Structure.ByReference {
    }
}
  1. 执行测试
package org.demo.apptest1.jnatest;


import com.sun.jna.Native;

public class DllTest {
    static {
        Native.setProtected(true);
        System.setProperty("jna.debug_load", "true");
    }

    public static void main(String[] args) {
        String path = "D://acc.file";
        MyStruct myStruct = new MyStruct();

        ExportFuncLib.INSTANCE.readInfo(path, myStruct);

        System.out.println(myStruct.toString());
    }
}

  1. 查看打印

在这里插入图片描述


http://www.niftyadmin.cn/n/5868973.html

相关文章

android 新增native binder service 方式(三)

书接上回&#xff0c;继续第三种方式&#xff0c;是手动生成 service binder 的方法,项目结构 1&#xff0c;编译aidl aidl 文件保持不变&#xff0c;如何生成Bn和Bp 文件呢。 aidl -I ./libserviceaidl/aidl -h ./ -o ./ --langcpp libserviceaidl/aidl/com/test/IService.a…

【LeetCode 热题100】 240. 搜索二维矩阵 II的算法思路及python代码

240. 搜索二维矩阵 II 编写一个高效的算法来搜索 m n m \times n mn 矩阵 m a t r i x matrix matrix 中的一个目标值 t a r g e t target target。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例 1&#xff1a; 输入…

4*A100 部署 deepseek-r1-671B

部署deepseek-r1-671B 使用 4*A100 部署 deepseek-r1-671b-1.58bit 大模型。 环境 ubuntu22.04LTScuda 12.2.0 要求 内存&#xff1a; 256GB及以上显存&#xff1a; 256GB及以上&#xff08;160G可以跑起来&#xff0c;但对于长上下文容易oom&#xff09;&#xff0c;这里…

在 compare-form.vue 中添加 compareDate 隐藏字段,并在提交时自动填入当前时间

在 compare-form.vue 中添加 compareDate 隐藏字段&#xff0c;并在提交时自动填入当前时间。 提交表单时存入的对象是FakeRegistration&#xff0c;这个对象里面有compareDate字段&#xff0c;刚好表格查询的对象也是FakeRegistration&#xff0c;所以表格展示的时间就是刚才…

Cramér-Rao界:参数估计精度的“理论底线”

Cramr-Rao界&#xff1a;参数估计精度的“理论底线” 在统计学中&#xff0c;当我们用数据估计一个模型的参数时&#xff0c;总希望估计结果尽可能精确。但精度有没有一个理论上的“底线”呢&#xff1f;答案是有的&#xff0c;这就是Cramr-Rao界&#xff08;Cramr-Rao Lower …

探秘分布式 IO 耦合器之高速背板总线

在工业自动化的复杂网络中&#xff0c;分布式 IO 耦合器扮演着关键角色&#xff0c;而其中的高速背板总线特性更是核心中的核心&#xff0c;如同一条信息高速公路&#xff0c;让数据传输高效又稳定。 传统的 IO 系统在数据交互时&#xff0c;常常面临数据拥堵、传输延迟等问题&…

Spring源码分析の循环依赖

文章目录 前言一、循环依赖问题二、循环依赖的解决三、整体流程分析 前言 常见的可能存在循环依赖的情况如下&#xff1a; 两个bean中互相持有对方作为自己的属性。   类似于&#xff1a; 两个bean中互相持有对方作为自己的属性&#xff0c;且在构造时就需要传入&#xff1a…

从两地三中心到多地多中心,OceanBase如何实现金融级高可用

“两地三中心”已成为金融领域基准的容灾部署模式。本文将简要阐述金融行业容灾架构中“两地三中心”的具体要求和部署&#xff0c;并进一步探讨OceanBase在实现“两地三中心”标准后&#xff0c;再至“多地多中心”部署中所展现的独特优势与特点。 商业银行的容灾要求 《商业…