>

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 to Managed interop에 대해 읽었습니다. 내가 찾고있는 것 같습니다. 올바르게 이해하면 Android 용 Mono 앱이 컴파일 될 때 ACW (Android Callable Wrappers)라고하는 Java 클래스가 생성됩니다. 그런 다음 Java 기반 Android 애플리케이션에서 이러한 ACW에 대한 메소드를 호출 할 수 있어야합니다.

문제는 Java 기반 Android 앱에서 컴파일 된 Mono for Android 애플리케이션 (apk파일)을 정확히 어떻게 참조합니까?

여기서 저는 지금 막 붙어서 구체적인 예를 찾지 못했습니다. SO에 대한 비슷한 질문이 있습니다 ( 이것 및 이것 ) 일부 블로그 게시물은 "ACW 사용"으로 요약됩니다.하지만 정확히 어떻게해야합니까?어쩌면 안드로이드 사용자가 아닌 분명한 부분이 누락되었을 수 있습니다.

내가 시도한 것은 안드로이드 용 모노에서apk으로dex파일을 동적으로로드하는 것입니다. 나는 그것을 단순히 저장소 카드에 넣고 DexClassLoader 를 사용하려고했습니다.  Java 기반 Android 앱에서로드하십시오 (이 블로그 게시물 ). ACW 클래스를 찾았지만 인스턴스를 만들려고 할 때 다음 오류가 발생했습니다.

No implementation found for native Lmno/android/Runtime;.register (Ljava/lang/String;Ljava/lang/Class;Ljava/lang/String;)

어떻게 Java 기반 앱에 Android 런타임 용 Mono를 포함시켜야한다고 생각하지만 어떻게 해야할지 모르겠습니다.

수정 : 이것은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를 참조하는 방법은 아직 명확하지 않으며 Googling은 관련 조회를 제공하지 않습니다. 지금 정말 충격을 받았습니다.

  • 답변 # 1

    당신이하려는 일을 올바르게 이해하고 있다면, 이것은 실제로 불가능합니다. 오류 메시지에서 알 수 있듯이, Mono for Android 애플리케이션의 활동은 올바르게 작동하기 위해 Mono 런타임에 의존합니다. 호출 가능 랩퍼는 Mono 런타임을 호출하는 얇은 Java 랩퍼 클래스이므로이 경우 자체적으로 유용하지 않습니다. 프로젝트를 빌드 한 후 obj/Debug/android/src 폴더를 보면 실제로 생성 된 호출 가능 랩퍼를 볼 수 있습니다. 예를 들면 다음과 같습니다.

    package androidapplication9;
    
    public class Activity1
        extends android.app.Activity
        implements
            mono.android.IGCUserPeer
    {
        static final String __md_methods;
        static {
            __md_methods = 
                "n_onCreate:(Landroid/os/Bundle;)V:GetOnCreate_Landroid_os_Bundle_Handler\n" +
                "";
            mono.android.Runtime.register ("AndroidApplication9.Activity1, AndroidApplication9, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", Activity1.class, __md_methods);
        }
    
        public Activity1 ()
        {
            super ();
            if (getClass () == Activity1.class)
                mono.android.TypeManager.Activate ("AndroidApplication9.Activity1, AndroidApplication9, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", "", this, new java.lang.Object[] {  });
        }
    
        public void onCreate (android.os.Bundle p0)
        {
            n_onCreate (p0);
        }
        private native void n_onCreate (android.os.Bundle p0);
        java.util.ArrayList refList;
        public void monodroidAddReference (java.lang.Object obj)
        {
            if (refList == null)
                refList = new java.util.ArrayList ();
            refList.add (obj);
        }
        public void monodroidClearReferences ()
        {
            if (refList != null)
                refList.clear ();
        }
    }
    
    

    Android가 작동하는 방식으로 인해 Java 애플리케이션이 외부 Java 활동을 시작하는 것과 동일한 방식으로 Mono for Android 애플리케이션에 정의 된 활동을 시작할 수 있습니다. 이것은 물론 설치되는 두 응용 프로그램에 의존하지만 Android 용 Mono 응용 프로그램과 Mono 런타임이 실제로 해당 활동을 실행하기 시작합니다.

    수정

    의견에서 제기 한 질문에 답변하기 위해 업데이트 중입니다. 와이즈 비즈  기본적으로 ACW 생성 방법을 좀 더 제어 할 수 있으므로 ACW에 특정 방법이나 필드가 있어야하고 이름이 무엇인지 지정할 수 있습니다. 레이아웃에 android : onClick 속성과 같은 것을 사용하려는 경우에 유용합니다. 예를 들어 ACW에 기본적으로 참조하려는 메소드가 포함되어 있지 않습니다.

    모노 런타임은 존재하지 않기 때문에 모노 for 안드로이드 응용 프로그램의 컨텍스트 외부에서 ACW를 많이 사용할 수 없습니다. C #으로 작성된 코드는 Mono 런타임을 기반으로 실행되며 컴파일 중 또는 이와 유사한 상황에서 Java로 변환되지 않습니다. 런타임에는 Dalvik (Android의 런타임)과 Mono의 두 가지 런타임이 있으며 호출 가능한 래퍼는 두 가지가 서로 통신 할 수 있도록합니다. 따라서 Mono for Android 클래스 라이브러리조차도 여전히 모노 런타임에 의존하므로 해당 런타임과 독립적으로 사용할 수 없습니다.

    이 다이어그램은 아키텍처의 모습과 런타임이 서로 관련되는 방식을 보여줍니다.

    이것이 문제를 해결하는 데 도움이되기를 바랍니다!

    ExportAttribute

관련 자료

  • 이전 jquery - __dopostback이 예상대로 작동하지 않습니다
  • 다음 sql server - 다 대다 관계의 다중 계단식 삭제 경로 (EF 41)