我在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 Callable Wrappers(ACW)的Java类。然后,我应该能够从基于Java的Android应用程序中调用这些ACW上的方法。
问题是,我该如何引用已编译的Mono for Android应用程序(apk文件)来自基于Java的Android应用程序?
我现在卡住了,找不到任何具体的例子。这里有一些类似的问题(this one和this one)和一些博客文章,但它们只是简单地说“使用ACWs”。但具体怎么做呢?也许我错过了什么显而易见的东西,因为我不是Android方面的人。
我尝试动态加载我从Mono for Android apk中提取的文件。我将其放在存储卡上,然后尝试使用Java-based Android应用程序中的DexClassLoader
加载它(我遵循了这篇博客文章)。找到了ACW类,但当我尝试创建它的实例时,出现了以下错误:
我想我需要以某种方式将Mono for Android运行时包含到基于Java的应用程序中,但我不知道该怎么做。未找到本地Lmno/android/Runtime;.register (Ljava/lang/String;Ljava/lang/Class;Ljava/lang/String;)的实现
编辑: 这是我正在尝试加载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();
}
编辑2: 我现在在这里阅读到,应该可以直接从Java启动使用Mono for Android编写的活动。但我仍然不清楚如何从Java引用Mono for Android,谷歌搜索没有相关结果。现在真的很困惑。