Java调用C#

news/2024/11/7 3:35:59/

由于项目采用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.ppmy.cn/news/74480.html

相关文章

03 mysqlDay01

什么是数据库及其作用 DB:本质是操作磁盘的文件 作用:大大提高数据的操作效率 什么是数据库管理系统 DBMS:管理数据库的软件,Oracle,mysql,DB2,SQL Server 数据库应用系统 使用数据库开发的软件 常用的关系型数据库 Oracle,mysql,DB2,SQL Server 常用的非关系型数据库…

[组合数学]母函数与递推关系

文章目录 母函数---解决计数组合 球相同 盒子不同 不能是空 C n − 1 m − 1 \quad C_{n-1}^{m-1} Cn−1m−1​数的拆分 递推关系常系数线性齐次递推关系常系数线性非齐次递推关系汉诺塔递推关系 母函数—解决计数 普母函数—组合问题 指母函数—排列问题 f(x) ∑ i 1 n a i…

使用FFMPEG进行音频重采样

准备 1. ffmpeg 4.4 2. sdl2 3.一段原始的音频PCM数据 重采样流程 1.设置输入音频参数和输出音频参数 2.根据设置的参数初始化SwrContent上下文 3.创建一个输入buffer, 根据输入的音频参数(采样率,通道数,样本位深度)申请空间…

Vm2沙箱逃逸漏洞复现(CVE-2023-32314)

0x01 产品简介 Node.js Node.js 是一个基于 V8 引擎的开源、跨平台的 JavaScript 运行环境,它可以在多个操作系统上运行,包括 Windows、macOS 和 Linux 等。Node.js 提供了一个运行在服务器端的 JavaScript 环境,使得开发者可以编写并发的、…

【Atlas200】华为AIPP配置文件使用

目录 AIPP介绍图像处理顺序例子:YUV420SP_U8转BGR格式归一化配置对应公式crop及padding功能配置生效AIPP转换模板 AIPP介绍 华为的AIPP(AI Preprocessing)是一种面向AI应用的图像预处理技术,旨在提高AI应用的效率和精度。AIPP支持…

【C++学习第十一讲】C++数据类型

文章目录 一、编程语言中的数据类型1.1 整型(Integer)1.2 浮点型(Floating-Point)1.3 字符型(Character)1.4 布尔型(Boolean)1.5 数组(Array)1.6 字符串&…

LeetCode 1373. Maximum Sum BST in Binary Tree【DFS,二叉搜索树】困难

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…

Qt学习-QMap、QString

1、容器的概念 用于存储给定的数据类型的值&#xff0c;它是模板类&#xff0c;更具提供T的不同存储不同数据。 连续容器&#xff1a;QVector<T>,QLinkedList<T>,QList<T> 关联容器&#xff1a;QMap<K,T>,QHash<K,T> 2、Qt提供两个关联容器类…