jna调用c++动态库实体类传参

1、win10平台代码 c++ 头文件

pch.h

cpp 复制代码
#ifndef PCH_H
#define PCH_H

// 添加要在此处预编译的标头
#include "framework.h"

#ifdef __cplusplus
#define EXPORT extern "C" __declspec(dllexport)
#else 
#define EXPORT __declspec(dllexport)
#endif


typedef struct Example3Struct {
	int val;
	char* name;
} Example3Struct;

EXPORT void example3_sendStruct(const Example3Struct* sval);
#endif //PCH_H

cpp文件 pch.cpp

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

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



	void example3_sendStruct(const Example3Struct* sval)
	{
		// note: printfs called from C won't be flushed
		// to stdout until the Java process completes
		std::cout << sval->val << std::endl;
		std::cout << sval->name << std::endl;
	}

使用Visual Studio 导出动态库

java 调用

复制代码
VideoAiLibrary.java
java 复制代码
package com.example.demo.jna;

import com.sun.jna.Library;
import com.sun.jna.Structure;


public interface VideoAiLibrary extends Library {

    @Structure.FieldOrder({"val","name"})
    public static class Example3Struct extends Structure {
        public static class ByReference extends Example3Struct implements Structure.ByReference {}

        public int val;
        public String name;
    }

    // unless otherwise specified, ByReference is assumed - but it can't hurt to be explicit
    public void example3_sendStruct(Example3Struct.ByReference sval);
}

测试

cpp 复制代码
package com.example.demo.jna;

import com.sun.jna.Native;

public class JnaTest {

    public static  void main(String ... args){
        final VideoAiLibrary clib = (VideoAiLibrary) Native.load("mycpp11", VideoAiLibrary.class);

        final VideoAiLibrary.Example3Struct.ByReference e3ref = new VideoAiLibrary.Example3Struct.ByReference();
        e3ref.val = 700;
        e3ref.name="朱dddp";
        clib.example3_sendStruct(e3ref);
    }

}

linux 代码唯一区别是 pch.h头文件 内容如下

cpp 复制代码
#ifndef PCH_H
#define PCH_H


#ifdef __cplusplus
#ifdef _WIN32
#define EXPORT extern "C" __declspec(dllexport)
#else
#define EXPORT extern "C"
#endif
#else
#ifdef _WIN32
#define EXPORT __declspec(dllexport)
#else
#define EXPORT
#endif
#endif

typedef struct Example3Struct {
	int val;
	char* name;
} Example3Struct;

EXPORT void example3_sendStruct(const Example3Struct* sval);
#endif //PCH_H
bash 复制代码
cd /aiprogram/cpp/JNA_TEST/

#编译c++ 动态库
 bash runcpp.sh

#运行java代码示例
 bash runjava.sh

linux 编译和java 代码如下

src 下c++代码,include 下c++的.h头文件,java_code 下java代码

通过百度网盘分享的文件:JNA_TEST.zip

链接:https://pan.baidu.com/s/1uA4r8gJM5-vut73OoAQZMg?pwd=4ob0

提取码:4ob0

相关推荐
Peter(阿斯拉)4 分钟前
[Java性能优化]_[时间优化]_[字符串拼接的多种方法性能分析]
java·性能优化·stringbuilder·string·字符串拼接·stringbuffer·时间优化
fqbqrr4 分钟前
2508C++,支持rdma通信的高性能rpc库
c++·rpc
晓得迷路了29 分钟前
栗子前端技术周刊第 94 期 - React Native 0.81、jQuery 4.0.0 RC1、Bun v1.2.20...
前端·javascript·react.js
江城开朗的豌豆29 分钟前
React Native 实战心得
javascript
liulilittle37 分钟前
BFS寻路算法解析与实现
开发语言·c++·算法·宽度优先·寻路算法·寻路
江城开朗的豌豆38 分钟前
React状态更新踩坑记:我是这样优雅修改参数的
前端·javascript·react.js
阿珊和她的猫1 小时前
autofit.js: 自动调整HTML元素大小的JavaScript库
开发语言·javascript·html
喜欢吃燃面1 小时前
C++算法竞赛:位运算
开发语言·c++·学习·算法
草莓熊Lotso1 小时前
《详解 C++ Date 类的设计与实现:从运算符重载到功能测试》
开发语言·c++·经验分享·笔记·其他
困鲲鲲1 小时前
CPP多线程2:多线程竞争与死锁问题
c++·多线程·死锁