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