【问题标题】:Monodroid, Interop betwen Java and C#Monodroid,Java 和 C# 之间的互操作
【发布时间】:2011-09-19 07:04:14
【问题描述】:

我们在 Android 下有一个大的 Java 应用程序(“大”只是意味着翻译应用程序的工作量太大)。我们必须访问一个用.Net 编写的引擎(这个引擎也太“大”了......)。这个引擎只是计算。

因此,我们寻求使用 monodroid 的解决方案。我们的主要问题是 monodroid 和 Java 之间的互操作。这时,我们得到:

  • 从 Mono 应用程序调用 .jar 库中的 Java 函数

但是我们不能调用和启动 Java 活动。有可能吗?

第二个问题是我们不知道如何从 Java 到 Mono 进行通信。也可以吗?

【问题讨论】:

    标签: java .net interop xamarin.android


    【解决方案1】:

    有几种方法可以调用集成 Java 和托管代码,具体取决于您想要做什么。

    Java 到托管

    如果您需要调用某个托管方法,您也许可以使用Android Callable Wrappers,它是为每个Java.Lang.Object 子类生成的。不过limitations有很多,所以可能不太理想。

    如果您需要创建Activity,您可以使用Context.startActivity(),就像在Java 中一样。您可以查看生成的obj\Debug\android\AndroidManifest.xml 以确定要使用的适当类名,或者您可以使用例如ActivityAttribute.Name 手动控制 Java 端名称。 (推荐使用ActivityAttribute.Name,因为它会减慢类型加载速度。)

    Services 也是如此:使用 Context.startContext() 并继续您的快乐之路。

    如果您需要共享数据,最简单的方法是使用ContentProviderContentProviders 通常用于跨进程数据共享,但当您需要在 Java 和托管代码之间共享数据并且遇到 Android Callable Wrappers 的限制时,它们也应该在进程内可用。

    托管到 Java

    总的来说,从 C# 调用 Java 代码是 Java 代码调用 C# 的镜像:您可以使用例如Context.StartActivity()启动一个Java活动,通过Context.ContentResolver属性等使用Java端的ContentProvider

    从托管代码启动 Java 活动的示例是 GoogleMaps sample,其中 Context.StartActivity() is used to launch the included Java activity

    您还可以使用 Java Native Interface (JNI) support 从托管代码创建 Java 实例并在这些实例上调用方法。这是痛苦和脆弱的,但它可以工作并允许调用未公开的 API。

    【讨论】:

      【解决方案2】:

      您可以像这样从本机代码轻松调用 Java 活动:

      var intent = new Intent().SetClassName(this,"com.myapp.java.JavaActivity");
      StartActivity(intent);
      

      正如我从this article 了解到的,您可以通过 ACW 从 Java 调用本机代码,但我认为这太难了

      【讨论】:

      • 如果我已经回答了您的问题,请将其标记为答案。
      猜你喜欢
      • 2023-03-02
      • 1970-01-01
      • 2017-10-26
      • 2014-05-04
      • 2010-09-06
      • 1970-01-01
      • 1970-01-01
      • 2010-10-24
      • 1970-01-01
      相关资源
      最近更新 更多