用于 C# .Net 框架的 AndroidJavaClass 和 AndroidJavaObject
Posted
技术标签:
【中文标题】用于 C# .Net 框架的 AndroidJavaClass 和 AndroidJavaObject【英文标题】:AndroidJavaClass and AndroidJavaObject for C# .Net Framework 【发布时间】:2021-11-20 10:55:17 【问题描述】:我在 Unity 中有代码,它使用 androidJavaClass 和 AndroidJavaObject 调用在 Java 中为 Android 编写的函数,我想将此代码传递给 C# .Net 中的 dll,但我找不到一种简单的方法来调用 Java 函数使用C# .Net 因为 AndroidJavaObject 和 AndroidJavaClass 类是 Unity dll 独有的,这里是我的代码示例:
Java(安卓):
public class DeviceManager
public interface DeviceListener
void DoSomething();
private DeviceListener deviceListener;
public DeviceManager(DeviceListener deviceListener)
this.deviceListener = deviceListener;
public String[] getSomeData()
return new String[];
C#(统一):
public class DeviceListener : AndroidJavaProxy
DeviceManager deviceManager;
public DeviceListener(DeviceManager manager) : base("com.myapp.DeviceManager$DeviceListener")
this.deviceManager = manager;
public void DoSomething();
public class DeviceManager
private AndroidJavaObject jo;
public DeviceManager()
jo = new AndroidJavaObject("com.myapp.DeviceManager", new DeviceListener(this));
public string[] GetData()
AndroidJavaObject returnedData = jo.Call<AndroidJavaObject>("getSomeData");
return AndroidJNIHelper.ConvertFromJNIArray<string[]>(returnedData.GetRawObject());
在 C# .Net 而不是 Unity 中执行该示例的最佳方法是什么?
编辑:我的主要问题与了解如何从 .NET Framework 中的 .aar 文件在 Unity 的 dll C# 文件中获取对象和调用函数有关
编辑 2: 我找到了一些关于 Xamarin 的信息,也许这就是我要找的东西?:https://github.com/xamarin/monodroid-samples/tree/master/JavaIntegration/AarBinding 但即使我可以将 .aar 文件链接到 C# 中的 dll '不能以最好的方式回答我的问题,以创建与上述示例相同的代码
编辑 3: 目前,为了解决这个问题,我在我的 Visual Studio 项目中使用 UnityEngine .dll,但我想生成一个用于其他图形引擎的 .dll,所以我想能够找到与使用 Unity 自己的 .dll 来解决此问题不同的解决方案,因此我提到了 Xamarin,因为它是与 Android (Java) 进行通信的好方法,但我没有找到任何在外部使用它的示例在 Visual Studio 中创建的移动应用程序,因为在我的情况下,我需要从 .aar 文件中获取对象和调用函数
【问题讨论】:
您的目标是哪个脚本后端? il2cpp 还是单声道? @HamidYusifli 我实际上不确定,在 Unity 中,我在播放器设置中选择了 Mono > 脚本后端与 .Net 标准 2.0 api 兼容级别,但也许获得 il2cpp 的解决方案也很有用?我目前在 C++ dll 中有代码,然后由 C#(.Net 框架) dll 使用,Unity 读取 C# Wrapper dll,但我希望 .aar 也可以在 C# dll 中读取,因此 Unity 只需要调用通过该文件运行。 【参考方案1】:您似乎正在寻找使用 AAR 插件,我自己没有做过,但 Unity 在 how to integrate it in your project 上有一个文档。
然后,一旦该库在 Android Studio 中编译并集成到 Unity 中,您可以查看 this example on how to call it from C# code。
我自己没有做过,但是这个例子应该能让你走上正轨。
关于脚本后端,我认为不会对此产生任何影响。
编辑 添加示例摘录
资产/插件/Android 将您的原生 android .AAR 文件放在此文件夹中。 现在让我们编写一些代码来调用插件。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NativeCodeRunner : MonoBehaviour
void Start()
CallNativePlugin();
//method that calls our native plugin.
public void CallNativePlugin()
// Retrieve the UnityPlayer class.
AndroidJavaClass unityPlayerClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
// Retrieve the UnityPlayerActivity object ( a.k.a. the current context )
AndroidJavaObject unityActivity = unityPlayerClass.GetStatic<AndroidJavaObject>("currentActivity");
// Retrieve the "Bridge" from our native plugin.
// ! Notice we define the complete package name.
AndroidJavaObject alert = new AndroidJavaObject("plugins.vsoft.com.library.Alert");
// Setup the parameters we want to send to our native plugin.
object[] parameters = new object[2];
parameters[0] = unityActivity;
parameters[1] = "Hello World!";
// Call PrintString in bridge, with our parameters.
alert.Call("PrintString", parameters);
【讨论】:
我已经有一个 .aar 插件,我真正想要的是用 .aar 插件在 C# .Net 框架中通信一个 dll,这样在 Unity 中我只需要与 dll 通信因为我的主要目标不仅是与 Unity 集成,还与其他不同平台集成 @MaríaRomán 您是否阅读了示例中的这一部分? Assets / Plugins / Android 将您的原生 android .AAR 文件放在此文件夹中。现在让我们编写一些代码来调用插件。这似乎是你想要的。也许我误解了你想要达到的目标...... @MaríaRomán 啊,我想我现在明白了,您希望您的 DLL 包含与 AAR 的通信,因此在 Unity 中您不必为此担心?如果这是正确的,那么您需要的是一个 Unity 包 (UPM),但其中编译了一个 C# DLL,您将在其上编写与 AAR 通信的代码。 是的,我目前正在这样做,但作为一个可以在其他图形引擎中使用的 dll,我想省略在 Visual Studio 项目中使用相同的 UnityEngine.dll @MaríaRomán 好的,那么,是的,您需要在与 Unity 无关的 Visual Studio 项目中编译此 DLL。然后将该 DLL 包含在 Unity 或其他引擎中,例如 Xamarin 或 Unreal(我自己没有使用过 unreal)。【参考方案2】:我的主要问题与知道如何获取对象和调用有关 来自 .NET Framework 中 .aar 文件的函数在 dll C# 文件中用于 团结
如果您想在自定义 DLL 中使用 AndroidJavaClass
或 AndroidJavaObject
方法,您应该添加对 Unity DLL 的引用。在 Visual Studio 中,在解决方案资源管理器中打开 References 的上下文菜单,然后选择 Add Reference。然后,选择浏览 > 选择文件。
在此阶段,选择位于UnityEngine
文件夹中的所需 .dll 文件。
using System;
/* Unity */
using UnityEngine;
namespace DLLTest
public class MyDLLTest
【讨论】:
是的,这是一个很好的解决方案,这就是我现在正在做的,但我想在 Unity 以外的平台上使用 dll,所以我评论了 Xamarin,因为它是一种可能的通信选项.Net 框架与 Android,问题是我在 Visual Studio 中找不到移动应用程序外部使用的良好示例,而是对 dll 的简单查询调用,因此将此 dll 用作 Unity 或任何其他框架中的中间节点跨度>以上是关于用于 C# .Net 框架的 AndroidJavaClass 和 AndroidJavaObject的主要内容,如果未能解决你的问题,请参考以下文章