用于 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 中使用 AndroidJavaClassAndroidJavaObject 方法,您应该添加对 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的主要内容,如果未能解决你的问题,请参考以下文章

C#教程02C# 环境

C# 入门系列01

INSTEAD OF INSERT 设置的主键在实体框架中抛出错误(ASP.NET 框架 c#)

可以使用 C# 的 Web 前端框架 Blazor

可以使用 C# 的 Web 前端框架 Blazor

可以使用 C# 的 Web 前端框架 Blazor