java - 用于 C# .Net 框架的 AndroidJavaClass 和 AndroidJavaObject

标签 java c# android unity3d xamarin

我在 Unity 中有代码,它使用 AndroidJavaClass 和 AndroidJavaObject 调用在 Java 中为 Android 编写的函数,我想将此代码传递给 C# .Net 中的 dll,但我找不到使用 C# .Net 调用 Java 函数的简单方法由于 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 不同的解决方案。 dll 来解决这个问题,因此我提到了 Xamarin,因为它是与 Android (Java) 进行通信的好方法,但我没有找到任何在 Visual Studio 中创建的移动应用程序之外使用它的示例,因为在我的情况下,我需要从 .aar 文件中获取对象和调用函数

最佳答案

似乎您正在寻找使用 AAR 插件,我自己没有做过,但 Unity 在 how to integrate it in your project 上有一个文档.
然后,一旦该库在 Android Studio 中编译并集成到 Unity 中,您可以查看 this example on how to call it from C# code .
我自己没有做过,但这个例子应该让你走上正轨。
关于脚本后端,我认为它不会对此产生任何影响。
编辑
添加了示例的摘录

Assets / Plugins / Android Place your native android .AAR file inside this folder. Now let’s write some code to call the plugin.

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);
    }
}

关于java - 用于 C# .Net 框架的 AndroidJavaClass 和 AndroidJavaObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69361041/

相关文章:

java - Maven 错误 : "You don' t have a SNAPSHOT project in the reactor projects list.“

c# - 如何从 Npgsql 异常判断调用是否值得重试( transient 故障策略)

c# - 如何更改 Entity Framework Code First 中的默认命名约定?

java - 将函数应用于 TextView 中的所有字符串

android - Webview Activity 崩溃

java - HttpPost 和 HttpGet 对象到 url 以便能够与 Volley 一起使用?

java - 在类定义的开头或构造函数中初始化成员变量?

java - Eclipse 中源代码的相对路径

java - 写入 .csv 文件中的新行而不覆盖第一行

c# - 派生类能否破坏基类的实现