运行c#代码从c++应用程序(Android NDK)免费

本文关键字:Android NDK 免费 应用程序 代码 c++ 运行 | 更新日期: 2023-09-27 17:54:17

我有一个c++游戏引擎,目前支持Windows, Linux和Android (NDK)。它建立在SDL之上,使用OpenGL进行渲染。

这个游戏引擎的设计约束之一是开发成本必须为0美元——我不需要花费任何成本(除了人力时间)来构建引擎,我必须被允许自由地重新分发引擎的代码和二进制文件,用户应该能够不受任何限制地出售使用该引擎创建的游戏。

现在,我正在使用一种非常慢的解释脚本语言来编写游戏逻辑——它实际上很适合编写粘合代码和对UI事件的简单响应,但除此之外就没什么用了。

我想用c#解决方案取代这个系统——让用户编译一个包含他们的游戏逻辑的c#类库(DLL),让c++端"消费"这个DLL并调用适当的钩子。

找到如何以跨平台方式实现这一点的信息相当困难。每个平台都有不同的方式来托管所需的运行时。而且,我找到的大多数文章都建议使用成熟的框架,这些框架提供了已经在我的引擎中实现的平台抽象。

目前是否有一种方法可以在不使用完全不同的SDK的情况下,从基于Android ndc++应用程序的c# DLL中运行代码,并且无需支付数百美元的许可证?

特别是,我正在关注微软最近的一些开源。net计划——有什么我可以使用的吗?

编辑:澄清一下,Windows和Linux都有"免费"运行。net代码的良好记录方式——这个问题特别适用于从Android NDK应用程序调用托管代码,而无需向Xamarin或其他供应商支付许可费用。

运行c#代码从c++应用程序(Android NDK)免费

找到如何以跨平台的方式实现这一点的信息相当困难…

我只打算解决"写一次,到处运行"的问题。

我建立和维护一个库,由一组单一的源代码组成,运行在Windows, Linux, OS X, Windows Phone, Android和iOS上。要做到这一点,我必须用可移植的C/c++编写所有内容,然后构建dll或共享对象。

该项目使用。net互操作调用到DLL, Android使用JNI调用到共享对象。在iOS上,创建的是静态库,而不是共享对象。

DLL或共享对象有一些特定于平台的定义。例如,它必须知道如何从底层操作系统获取随机数。所以它会有这样一个函数:

bool GetRandomNumbers(unsigned char* ptr, size_t size)
{
#if defined(WIN32) || defined(WIN64)
   ...
#elif defined(__linux___) || defined(linux)
   ...
#elif defined(__ANDROID___)
   ...
#endif
}

因此,保持您的核心业务逻辑可移植,并在DLL或共享对象中,#define中,您必须抽象平台差异,这样您就可以了。

在可移植库之上,您可以分层特定于平台的GUI内容。

如果你试图用c#写这个,然后在其他平台上使用它,你只会给自己带来问题。实现单源可移植性的唯一方法是使用可移植性的C/c++。

我也看到有人用各种语言重新实现:面向Windows的C和Win32,面向Windows的。net,面向Linux的C,面向OS X的Cocoa,面向Windows Phone的。net,面向Android的Java和面向iOS的CocoaTouch。这创造了大约6倍的工作量,并且不同平台的行为也不尽相同。

一个流行的游戏脚本引擎是Lua;您可以考虑使用它,因为很容易与C/c++链接。如果你使用LuaJIT,它在Android上也非常快(在iOS上也不差)。

一个可以考虑的选择是,如果你在Cocos2d-X上构建你的定制引擎,你不仅可以免费获得Lua(或JavaScript)作为连接的脚本引擎,你还可以移植到Windows (Win32和Windows 8.1 Universal), iOS, Mac和Linux,一个IDE(!!),以及一个巨大的支持社区。

或者你可以花很多时间来弄清楚如何将c#集成到你的引擎中。

简单的答案是no,您正在寻找的内容目前不存在。你需要放弃/改变需求来找到解决方案。

我所知道的最接近的是dot42 -它似乎支持android上的一些。net最近被放在github和主站关闭-但在主编译器存储库中没有提到许可证(我已经添加了一个bug来更新…)

目前还不清楚它是否支持c# .dll的动态加载,尽管它声称可以编译成DEX。(但它可能是免费的,这取决于开发人员发布的许可证…)

Xamarin是我所知道的唯一可行的替代方案,但正如您所知,只有入门版是免费的。

如果你所追求的纯粹是更好的脚本支持,我会放弃编译和c#的要求,并找到一些已经在android上工作得很好的东西。Lua是我的首选解决方案,但我以前没有在android上使用过它……还有很多其他的选择