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

发布于:2025-02-26 ⋅ 阅读:(124) ⋅ 点赞:(0)

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. 查看打印

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到