我在 Mono for Android 项目中创建了一个相当简单的 Activity:
[Activity(Label = "AndroidApplication1", MainLauncher = true, Icon = "@drawable/icon")]
public class Activity1 : Activity
{
private string value = "intitial";
[Export]
public string GetString()
{
return value;
}
[Export]
public void SetString(string newValue)
{
value = newValue;
}
}
该活动应仅用作概念验证,因此很简单。现在,我希望能够从“普通”、基于 Java 的 Android 应用程序中调用方法 GetString()。
在Xamarin 的文档中,我已经阅读了有关 Java 到托管互操作的信息,这似乎正是我正在寻找的。如果我理解正确的话,当 Mono for Android 应用程序编译时,它会生成称为 Android 可调用包装器 (ACW) 的 Java 类。然后我应该能够从基于 Java 的 Android 应用程序调用这些 ACW 上的方法。
问题是,我究竟如何从基于 Java 的 Android 应用程序中引用已编译的 Mono for Android 应用程序( apk文件)?
这就是我现在陷入困境并且无法找到任何具体示例的地方。SO(这个和这个)和一些博文也有类似的问题,但它们只是归结为“使用 ACW”。但具体如何?也许我在这里遗漏了一些明显的东西,因为我不是 Android 人。
我尝试的是动态加载我从 Mono for Android apk中提取的dex文件。我只是将它放在存储卡上,然后尝试使用基于 Java 的 Android 应用程序来加载它(我已经关注了这篇博文)。找到了 ACW 类,但是当我尝试创建它的实例时,出现以下错误:DexClassLoader
未找到本机 Lmno/android/Runtime;.register (Ljava/lang/String;Ljava/lang/Class;Ljava/lang/String;) 的实现
我想我必须以某种方式将 Mono for Android 运行时包含到基于 Java 的应用程序中,但我不知道如何。
编辑: 这是我试图加载dex的代码:
DexClassLoader cl = new DexClassLoader(dexInternalStoragePath.getAbsolutePath(),
optimizedDexOutputPath.getAbsolutePath(),
null,
getClassLoader());
try {
Class<?> classActivity1 = cl.loadClass("androidapplication1.Activity1");
// the following line throws the exception
Object a = classActivity1.newInstance();
Method getStringMethod = classActivity1.getMethod("GetString");
Object result = getStringMethod.invoke(angel);
result = null;
} catch (Exception e) {
e.printStackTrace();
}
EDIT2: 我现在在这里读到,应该可以从 Java 直接启动用 Mono for Android 编写的活动。我仍然不清楚如何从 Java 和谷歌搜索中引用 Mono for Android 并没有产生相关的命中。现在真的难住了。