Kotlin native 打包DLL 与 C# 代码间的相互访问

指定文件打包:kotlinc-native 需要先安装 

kotlin-native-prebuilt-windows-x86_64-2.0.0.zip
kotlinc-native  -p dynamic -o example Example.k

 

kotlin代码:

@OptIn(ExperimentalNativeApi::class)
@CName("exampleFunction")
fun exampleFunction(name: String, password: String): String {
    return "$name - Hello from Kotlin/Native! - $password"
}

@OptIn(ExperimentalNativeApi::class)
@CName("testCallback")
fun testCallback(name: String, password: String, callback : (p : String) -> String) {
    callback("$name - $password")
}

@OptIn(ExperimentalNativeApi::class, ExperimentalForeignApi::class)
@CName("callbackMethod1")
fun callbackMethod1(t: CPointer<CFunction<() -> CArrayPointer<ByteVar>>>) : String {
    return t.reinterpret<CFunction<() -> CArrayPointer<ByteVar>>>().invoke().toKString()
}

@OptIn(ExperimentalNativeApi::class, ExperimentalForeignApi::class)
@CName("callbackMethod2")
fun callbackMethod2(t: CPointer<CFunction<(CValues<ByteVar>, CValues<ByteVar>) -> CArrayPointer<ByteVar>>>) : String {
    return t.reinterpret<CFunction<(CValues<ByteVar>, CValues<ByteVar>) -> CArrayPointer<ByteVar>>>().invoke(
        "zzm".cstr,
        "123456".cstr
    ).toKString()
}

@OptIn(ExperimentalNativeApi::class, ExperimentalForeignApi::class)
@CName("getTT1")
fun getTT1(name: String, password: String): TT1 {
    return TT1(name, password)
}

@OptIn(ExperimentalNativeApi::class, ExperimentalForeignApi::class)
@CName("getTT1Name")
fun getTT1Name(obj: TT1): String {
    return obj.name
}

@OptIn(ExperimentalNativeApi::class, ExperimentalForeignApi::class)
@CName("getTTm1")
fun getTTm1(obj: TT1): String {
    return obj.m1()
}

class TT1(
    val name: String,
    val password: String
){

    fun m1() : String{
        return "$name -- $password"
    }
}

C#代码:
 

const string DllName = "C:\\git-code\\AIOT_aqara_sys\\build\\bin\\native\\debugShared\\aqaraSys.dll";


[DllImport(DllName, EntryPoint = "exampleFunction", CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr exampleFun(string name, string password);

[DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr callbackMethod1(IntPtr t);

[DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr callbackMethod2(IntPtr t);

[DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr getTT1(string name, string password);

[DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr getTT1Name(IntPtr t);

[DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr getTTm1(IntPtr t);


// 在C#中实现回调函数
public static string MyCallbackFunction1()
{
    return "uu";
}

// 在C#中实现回调函数
public static string MyCallbackFunction2(string name, string pwd)
{
    return name + "uu" + pwd;
}

// 定义一个 delegate 来匹配你的回调函数的签名
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate string Callback1Delegate();

// 定义一个 delegate 来匹配你的回调函数的签名
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate string Callback2Delegate(string name, string pwd);


static void Main(string[] args)
{

    Console.WriteLine("start test...");

    // 调用 exampleFunction 函数
    IntPtr resultPtr = exampleFun("name", "password");
    string result = Marshal.PtrToStringAnsi(resultPtr);
    Console.WriteLine("exampleFunction:" + result);

    // 创建一个 delegate 实例
    Callback1Delegate c1 = MyCallbackFunction1;
    IntPtr r1 = callbackMethod1(Marshal.GetFunctionPointerForDelegate(c1));
    string result1 = Marshal.PtrToStringAnsi(r1);
    Console.WriteLine("callbackMethod:" + result1);


    // 创建一个 delegate 实例
    Callback2Delegate c2 = MyCallbackFunction2;
    IntPtr r2 = callbackMethod2(Marshal.GetFunctionPointerForDelegate(c2));
    string result2 = Marshal.PtrToStringAnsi(r2);
    Console.WriteLine("callbackMethod1:" + result2);


    // 调用 exampleFunction 函数
    IntPtr tt1Ptr = getTT1("namexx", "password");

    IntPtr tt1NamePtr = getTT1Name(tt1Ptr);
    string tt1Name = Marshal.PtrToStringAnsi(tt1NamePtr);
    Console.WriteLine("getTT1Name:" + tt1Name);


    IntPtr tt1m1Ptr = getTTm1(tt1Ptr);
    string tt1m1 = Marshal.PtrToStringAnsi(tt1m1Ptr);
    Console.WriteLine("getTT1Name:" + tt1m1);

    Console.WriteLine("end test...");
}

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

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

相关文章

哈希表散列表

文章目录 哈希表概述哈希表详解什么是 Hash 冲突哈希冲突的常见解决方法HashMap 如何解决 Hash 冲突的 哈希表概述 哈希表&#xff08;Hash Table&#xff09;是一种数据结构&#xff0c;用于实现键值对的存储和快速检索。它通过将键映射到数组的索引位置来实现高效的查找操作…

ERC-7401:嵌套 NFT 标准的全新篇章

在数字资产和区块链技术迅速发展的今天&#xff0c;非同质化代币&#xff08;NFT&#xff09;已经成为了一种重要的资产形式&#xff0c;广泛应用于艺术、游戏、收藏品等多个领域。随着市场需求的多样化&#xff0c;传统的 NFT 标准如 ERC-721 和 ERC-1155 已经不能完全满足用户…

Keras深度学习框架实战(2):估计模型训练所需的样本量

1、模型训练样本量评估概述 1.1 样本量评估的意义 预估模型需要的样本量对于机器学习项目的成功至关重要&#xff0c;以下是几个主要原因&#xff1a; 防止过拟合与欠拟合&#xff1a; 过拟合&#xff1a;当模型在训练数据上表现极好&#xff0c;但在未见过的测试数据上表现糟…

5步3分钟0基础搭建,轻松搭建《雾锁王国》私人服务器

继《幻兽帕鲁》游戏爆火之后&#xff0c;与它同类型的《雾锁王国》也是强力刷屏&#xff0c;不分伯仲&#xff0c;在 Steam 上的评分一直稳定在“特别好评”&#xff0c;让小伙伴们很“上头”。就在两者游戏玩家反响爆火的同时&#xff0c;官方服务器人数爆满&#xff0c;卡顿频…

关闭数据库默认配置配置自定义数据库

在实际项目中使用了通过配置中心配了数据库&#xff0c;而我们改了application.yml并没有起作用&#xff0c;我们可以手动创建一个配置类来定义自定义的数据源&#xff0c;并在Spring容器中注册它 PrimaryBeanpublic DataSource customDataSource() {return DataSourceBuilder.…

C语言Linux进度条模拟

在Linux字符界面中&#xff0c;使用yum、apt下载东西时会有一个图形化的进度条&#xff0c;可以告诉我们任务的执行进度。 我们也可以通过C语言实现一个类似的进度条&#xff0c;并且可以做得更加美观。以后我们自己写的程序需要显示进度时就可以去调用我们自己实现的进度条。 …

【typescript/flatbuffer】在websocket中使用flatbuffer

目录 说在前面场景fbs服务器代码前端typescript代码问题 说在前面 操作系统&#xff1a;Windows11node版本&#xff1a;v18.19.0typescript flatbuffer版本&#xff1a;24.3.25 场景 服务器(本文为golanggin)与前端通信时使用flatbuffer进行序列化与反序列化通信协议为websock…

从0开始制作微信小程序

目录 前言 正文 需要事先准备的 需要事先掌握的 什么是uniapp 平台应用的分类方式 什么是TypeScript 创建项目 项目文件作用 源码地址 尾声 &#x1f52d; Hi,I’m Pleasure1234&#x1f331; I’m currently learning Vue.js,SpringBoot,Computer Security and so on.&#x1…

有点混乱的普里姆算法求最小生成树

Graph.h #pragma once //邻接矩阵的创建 #include<stdio.h> #include <stdlib.h> #include<assert.h> #include<string.h> #include<stdbool.h> #include<limits.h> #define MAX 100 #define INF INT_MAX typedef struct Graph {int n;…

一周学会Django5 Python Web开发 - Django5内置Admin系统二次开发

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计56条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

System-Verilog 实现DE2-115倒车雷达模拟

System-Verilog 实现DE2-115倒车雷达模拟 引言&#xff1a; 随着科技的不断进步&#xff0c;汽车安全技术也日益成为人们关注的焦点。在众多汽车安全辅助系统中&#xff0c;倒车雷达以其实用性和高效性脱颖而出&#xff0c;成为现代汽车不可或缺的一部分。倒车雷达系统利用超声…

Laya:【音效BUG】在游戏失焦后再次返回游戏导致音效播放异常的问题与解决方案

PS&#xff1a;ios 上不支持 ogg格式音频, 全部使用MP3.或者 在只ios不使用ogg。 复现方法&#xff1a; 1.用Laya.SoundManager.playMusic()随意播放一个音效文件 2.在项目内开启Laya.SoundManager.autoStopMusic true; //通过窗口失焦静音键让音频自动跟随设备静音 3.使游戏失…

如何使用 Nginx 创建临时和永久重定向

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 简介 HTTP 重定向 是将一个域名或地址指向另一个的方法。有几种不同类型的重定向,每种对客户端浏览器意味着不同的事情。最常见的两种类型是临时重定向和永久重定向。…

idea中导入代码文件无法修改,显示File is read-only,怎么办?难办?那就别办了------看下面

File is read-only 文件属性只读&#xff0c;不可修改。。。。。 第一次遇到这种问题&#xff0c;去网上搜了一堆方法&#xff0c;都试了&#xff0c;没用&#xff0c;最后居然还建议我重装idea&#xff0c;我还差点信了&#xff0c;经9X9难后&#xff0c;取得真经。 问题解决…

STM32 | 方式1:手机发送指令,开发板向手机发送温湿度;方式2:手机发送指令,开发板定时向手机发送温湿度。

​01、知识回顾 STM32 | HC-SR04 超声波测距模块 | DHT11数字温湿度传感器(第七天)STM32 | 数字温湿度传感器DHT11STM32 | HC-SR04 超声波测距模块STM32 | DHT11数字温湿度传感器实战STM32 | 超声波实战02、作业1 1、通过手机的两方式获取温湿度. 方式1:手机发达指令,开发…

Spring Boot项目中,如何在yml配置文件中读取maven pom.xml文件中的properties标签下的属性值

一、前言 在最近的项目开发过程中&#xff0c;有一个需求&#xff0c;需要在Spring Boot项目的yml配置文件中读取到mave的 pom.xml文件中的properties标签下的属性值&#xff0c;这个要怎么实现呢&#xff1f; 二、技术实践 pom.xml文件中增加测试属性 <properties><…

汇舟问卷:兼职做国外问卷三小时挣200

在繁忙的都市生活中&#xff0c;许多人为了生计而日夜奔波。对于大多数人来说&#xff0c;白天的工作已经足够充实&#xff0c;但依然有很多人选择在下班时间&#xff0c;多做些什么&#xff0c;为自己带来一份额外​的收入。 目前下班做的兼职工作不是跑滴滴&#xff0c;就是…

7_2、C++程序设计进阶:数据共享

数据与函数 数据与函数局部变量全局变量类的数据成员 类的静态成员静态数据成员静态函数成员 友元友元函数友元类 函数之间实现数据共享有以下几种方式&#xff1a;局部变量、全局变量、类的数据成员、类的静态成员和友元。 如何共享局部变量呢&#xff1f; 在主调函数和被调…

YOLOV10:参数越少,速度越快,性能更高的新一代目标检测框架

摘要 在过去的几年中&#xff0c;YOLOs由于在计算成本和检测性能之间实现了有效的平衡&#xff0c;已经成为实时目标检测领域的主导范式。研究人员已经探索了YOLOs的架构设计、优化目标、数据增强策略等&#xff0c;取得了显著的进展。然而&#xff0c;对非极大值抑制&#xf…

Redis学习笔记【基础篇】

SQL vs NOSQL SQL&#xff08;Structured Query Language&#xff09;和NoSQL&#xff08;Not Only SQL&#xff09;是两种不同的数据库处理方式&#xff0c;它们在多个维度上有所差异&#xff0c;主要区别包括&#xff1a; 数据结构: SQL&#xff08;关系型数据库&#xff09;…