由于项目采用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();
}
运行结果: