私はAndroidプロジェクトのためにMonoでかなり単純なアクティビティを作成しました:
[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からManagedへの相互運用について読んだことがあります。これはまさに私が探しているもののようです。私が正しく理解していれば、Mono for Androidアプリがコンパイルされると、Android Callable Wrappers(ACW)と呼ばれるJavaクラスが生成されます。そうすれば、JavaベースのAndroidアプリケーションからこれらのACWのメソッドを呼び出すことができるはずです。
問題は、 JavaベースのAndroidアプリからコンパイルされたMono for Androidアプリケーション(apkファイル)をどのように正確に参照するかです。
これは私が今立ち往生していて、具体的な例を見つけることができなかった場所です。SO(これとこれ)といくつかのブログ投稿についても同様の質問がありますが、要約すると「ACWを使用する」ということです。しかし、どのくらい正確に?たぶん私はここで明らかな何かを見逃しています。Androidの男ではありません。
私が試したのは、Mono forAndroidapkからヤンクしたdexファイルを動的にロードすることです。それをストレージカードに置いてDexClassLoader
から、JavaベースのAndroidアプリから使用してロードしようとしました(このブログ投稿をフォローしました)。ACWクラスが見つかりましたが、そのインスタンスを作成しようとすると、次のエラーが発生しました。
ネイティブLmno/android / Runtime; .register(Ljava / lang / String; Ljava / lang / Class; Ljava / lang / String;)の実装が見つかりません
どういうわけか、Androidランタイム用のMonoを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からAndroid用のMonoで書かれたアクティビティを直接開始できるはずだと読んでいます。JavaからAndroid用のMonoを参照する方法はまだはっきりしていません。グーグルでは、関連するヒットは得られません。本当に今困惑しています。