Java调用C#

news2024/11/26 6:27:40

由于项目采用Hybrid热更,走纯C#开发,目前战斗由客户端到服务端(客户端提供dll),服务端负责调用,故需要走Java 调C# dll逻辑。

1、JNI:不支持泛型(pb)没法转C++成功

2、JNA:亲测可用。原理Java调用C++ ,C++调C#

操作步骤:

        1、生成C#dll,放在java工程所用的jdk,bin目录下

using System.Collections.Generic;
using System.IO;
using System;
using System.Collections;
using System.Linq;
using System.Reflection;
using Proto;

namespace CScriptDll
{
    public class JCSTest
    {
        public int Sum(int _x, int _y)
        {
            return _x + _y;
        }
        
        public int GetInt()
        {
            return new TestClass().Str;
        }
        public static byte[] GetBytes()
        {
            return File.ReadAllBytes("GlobalConfig.bytes");
        }
        public float GetGobal()
        {
            //此处通过pb读取表
            GlobalConfigMgr.LockLoadTable();
            return GlobalConfigMgr.GetFloatVal(EGlobal.Advertisements);
        }
    }
    public class TestClass
    {
        public int Str = 1996;
    }

}

         2、创建C++ dll。

        添加引用,引用导出的C#的dll文件,然后输出代码如下:

#include "pch.h"

#ifdef MYLIBAPI 
#else 
#define  MYLIBAPI  extern "C" __declspec(dllimport)     
#endif 
MYLIBAPI int add(int a, int b); //添加函数声明
MYLIBAPI int GetInt();
MYLIBAPI float GetGobal();

using namespace System;
using namespace CScriptDll;

int add(int a, int b) {
    JCSTest^ test = gcnew JCSTest();
    return test->Sum(a, b);
}

int GetInt() {
    JCSTest^ test = gcnew JCSTest();
    return test->GetInt();
}
float GetGobal() {
    JCSTest^ test = gcnew JCSTest();
    return test->GetGobal();
}

注意:属性->常规->配置类型(动态库.dll)

        属性->高级->公共语言运行时支持(/clr)

       错误: 严重性代码说明项目文件行禁止显示状态错误C7681    C++/CLI 或 C++/CX 不支持两阶段名称查找;请使用 /Zc:twoPhase-  

        出现上述错误:属性->c/C++/语言->符合模式(否)

       3、JAVA调用 :导入两个jar包,并加入库。jna地址:

GitHub - java-native-access/jna: Java Native Access

package org.example;

import java.io.IOException;
import com.sun.jna.Library;
import com.sun.jna.Native;
public class Main {
    public static void main(String[] args) throws IOException {
        JavaToCS clib = JavaToCS.Instance;
        System.out.println("测试返回结果:"+clib.add(9965, 13));
        System.out.println("测试返回结果getInt :"+clib.GetInt());
        System.out.println("测试返回结果getInt :"+clib.GetGobal());

    }
}
interface JavaToCS extends Library {
    JavaToCS Instance = (JavaToCS) Native.loadLibrary("E:\\VSProject\\JavaToCPP\\x64\\Debug\\JavaToCPP.dll",JavaToCS.class);

    /*需要调用的方法,方法名与c++方法名相同*/
   int add(int a,int b);
    int GetInt();
    float GetGobal();
}

 运行结果:

        

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

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

相关文章

MatebookE2022款i7集显 华为智能磁吸键盘(DRC-W76)原装出厂Win11系统恢复原厂OEM系统

HUAWEI华为笔记本电脑,Matebook E 2022款 i7 集显 华为智能磁吸键盘 16GB512GB (DRC-W76)原装出厂Windows11系统恢复原厂OEM系统 系统自带所有驱动、办公软件、华为电脑管家等预装软件 链接:https://pan.baidu.com/s/1t7bczFO_RvD31g1uIZoGgw?pwdq2g0 …

前端面试题整理2

目录 1.讲解es6新增map和set? 2.Ts的枚举和元组是什么? 3.vue3中的beforeEnter钩子函数怎么用? 4.获取数据时,加载loading动画,在哪取消比较好Diff算法的优化在哪? 5.Jq中的$(this)和this的区别&#x…

单片机--STM32

【1】课程回顾 【2】课程介绍 1.单片机简介 单片机是单片微型计算机的简称,Mcu是Microcontroller的简称,也就是嵌入式微控制器。采用集成电路技术将具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、定时器/计时器、多种I/O口和中断系统…

P1772 [ZJOI2006] 物流运输

题目提供者 洛谷 难度 提高/省选- 题目描述 物流公司要把一批货物从码头 A 运到码头 B。由于货物量比较大,需要 n 天才能运完。货物运输过程中一般要转停好几个码头。 物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟…

20230516使用python3确认三门问题

最烧脑的悖论,意识为什么会影响未来?颠覆你认知的三门问题播报文章 小红虾实验室 2023-04-09 06:08 四川 好看视频优创联盟,优质科学领域创作者 关注 对于懂概率的人来说,他中大奖的概率将成倍增加,甚至获奖率能够达到100%。 今…

【量化交易笔记】6.布林带的实现

上一讲介绍A股移动平均值(MA)指标,本讲我们来讲解布林布的实现。 布林线(BOLL)技术指标简介 布林线(Bollinger Bands,BOLL)又称布林带,是约翰布林(John Bol…

dbForge Studio for SQL Server Crack

dbForge Studio for SQL Server Crack 增加了对源代码管理中的数据操作语言(DML)触发器排序的支持。 添加了对不使用EXEC/EXECUTE关键字调用过程/函数的语法支持。 在语法检查中添加了对EXEC命令的支持。 dbForge Studio for SQL Server是一个IDE,用于SQL Server中的…

抖音本地生活服务商贴牌小程序

作为社交电商平台的一部分,抖音本地生活服务的市场前景非常广阔。以下是抖音本地生活服务商市场前景的几个方面: 巨大的用户群体:抖音拥有数亿的用户,这些用户中有很多人需要本地生活服务,如美食、酒店、旅游等&am…

对话三维家创始人蔡志森:AIGC让家装从“填空题”变成了“选择题”

(图片来源:Pixels) 三维家讲透了一个道理:数字化企业如何利用已有优势构建AGI能力。 数科星球原创 作者丨苑晶 编辑丨大兔 AIGC火热半年有余,人们已对ChatGPT不再陌生。 从互联网巨头再到上一代AI企业,…

TiKV 新架构:Partitioned Raft KV 原理解析

作者:徐奇 TiKV 推出了名为“partitioned-raft-kv”的新实验性功能,该功能采用一种新的架构,不仅可以显著提高 TiDB 的可扩展性,还能提升 TiDB 的写吞吐量和性能稳定性。 在上一篇文章中,我们介绍了 Partitioned Raf…

就业内推 | 中国移动招网工,有云计算认证的看过来

01 中移集成 🔷招聘岗位:云网络工程师 🔷职责描述: 1、具有云网项目售前工作经验,精通云网络架构和技术原理;熟悉国内主流云厂商阿里云、腾讯云等整体架构和产品体系。 2、具备一定的云网项目交付能力&…

【追梦之旅】——栈居然还能这样玩?!+ 力扣 - 有效括号

【追梦之旅】——栈居然还能这样玩?! 力扣 - 有效括号 ~😎 前言🙌什么是栈?栈的C语言实现头文件编写源码:功能文件编写源码:测试文件编写源码: 力扣题解——有效的括号 总结撒花&…

从C出发 33 --- 自定义数据类型(中)

struct 结构体类型的本质是 数据类型 ,既然是数据类型,就是用来创建变量,而创建的这个变量其实是 变量的集合,是结构体里面成员变量的集合 struct Test {int a,b;}; struct Test tt.a 1; t.b 2;//意味着,结构体变…

数据结构学习记录——图的遍历(深度优先搜索、广度优先搜索、为什么需要两种遍历、图不连通怎么办)

目录 深度优先搜索 概念 图解过程 伪代码 时间复杂度 具体代码(C语言) 广度优先搜索 概念 图解过程 伪代码 时间复杂度 具体代码(C语言) 为什么需要两种遍历 图不连通怎么办 连通 路径 回路 连通图 连通…

FreeRTOS(2)----任务管理

一,任务的基本概念 FreeRTOS是一个支持多任务的操作系统,多个任务可以共享一个优先级,当任务configUSE_TIME_SLICING 为 1,则可以使用时间调度的方式共享处理器。 简而言之,freertos任务就是一系列任务的集合。 二&…

day05_Java中的运算符

在Java中提供了丰富的运算符 其按照功能分:算术运算符、赋值运算符、比较运算符、逻辑运算、条件运算符按照操作数个数分:一元运算符(单目运算符)、二元运算符(双目运算符)、三元运算符 (三目…

python 元类

目录 元类type介绍使用元类创建类直接使用type继承type 类和对象的创建过程元类有什么用使用元类实现一个单例模式 元类type介绍 我们知道在python中一切皆对象,即使是类,也是对象,那么类这个对象是的类是谁呢?那就是元类。 通过…

Autosar NM网络管理机制(三大三小模式切换、NM网络报文的帧格式解析、NM中用到的定时器配置)

网络管理机制 AUTOSAR网络管理机制其实十分简单,概括下来三句话: 需要通信就发网络报文,否则就停发网络报文,所有节点同睡同醒。 下图是网络管理的状态机: 网络管理包括三个模式:Network Mode、Prepare …

【指针初阶 2023516】

#include <stdio.h>int main() {int a 100;int * pa &a;//pa是专门用来存放地址&#xff08;指针&#xff09;的&#xff0c;这里的pa就被称为指针变量char* pc &a;//指针变量在32为平台下是4个字节//指针变量在64为平台下是8个字节//int arr[10];//printf(&q…

计算机图形学-GAMES101-3

一、transformation-变换 &#xff08;1&#xff09;Scale 缩放变换示意图 图形每个像素对应坐标的计算公式 写成缩放矩阵的形式 非均匀缩放 &#xff08;2&#xff09;Reflection Matrix 镜面变换示意图 图形每个像素对应坐标的计算公式 写成镜像矩阵的形式 …