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
관련 자료
- GPIO 제어용 Java 클래스를 사용하여 Android OS에서 실행되는 애플리케이션을 만드는 방법
- javascript - Puppeeter를 사용하여 클래스 내에서 div 선택
- Android Room Database를 사용하여 동일한 테이블 내에서 일대 다 관계
- 도시 제한 내 마커 제한 android Google Maps
- wordpress - 포스트 아카이브 내에서 메타 값이 설정된 경우 클래스 설정
- unity3d - Unity Android 애플리케이션에 권한을 추가하는 방법은 무엇입니까?
- javascript - JS 클래스 내에서 깨진 이미지 숨기기
- c# - Xamarin Android의 애플리케이션 데이터 경로
- java - comgooglecommonutilconcurrentListenableFuture의 Android Studio 클래스 파일을 찾을 수 없습니다
- c# - 배열 내에 저장된 클래스 내에서 값을 얻으려면 어떻게합니까?
- 조각의 목록을 Android의 사용자 지정 뷰 클래스로 보내는 방법은 무엇입니까?
- javascript - for 루프 내의 모든 요소에 클래스 추가
- 네임 스페이스 Unity C # 경로 찾기 내 클래스에 액세스
- 클래스 내에서 개인 ArrayList를 어떻게 만듭니 까? (자바)
- java - Android-프로그래밍 방식으로 애플리케이션 로케일 변경
- 클래스 내 인스턴스를 사용하는 다트
- Java의 메서드 내에있는 클래스의 개체를 만드는 방법은 무엇입니까?
- robotics - 인터넷에 액세스 할 수없는 로컬 네트워크 내에서 WebRTC로 애플리케이션 실행
- time zones - Gmail (Android 애플리케이션)의 시간대를 어떻게 변경할 수 있습니까?
- java - 클래스에서 다른 클래스로 int 값을 가져올 수 없음 - android studio
- java : 화면이 잠겨 있거나 꺼져 있을 때 카메라 셔터 onkeyevent가 있는 Android 앱
- java : SQL Database에 연결하는 Android 스튜디오
- java : UNAUTHORIZED_DOMAIN:Domain이 프로젝트에서 허용되지 않는 이유는 무엇입니까?
- java : Android 클라이언트 새 소켓 명령이 작동하지 않는 이유
- java : Firebase 실시간 데이터베이스를 사용하여 RecyclerView에서 제목과 미리보기 이미지가 있는 pdf를 가져오고 있지만 recylcerview가 매번 깜박이고 충돌이 발생한 후
- java : 사용자가 대략적인 위치 정보 권한을 부여하면 Android 12 앱이 충돌합니다.
- java : Android Studio Emulator 배경 및 프레임이 화면에서 나오지 않음
- java : android.widget.RadioGroup을 android.widget.RadioButton으로 캐스팅할 수 없습니다.
- java : Android에서 ListView를 항목으로 채울 수 없음
- java : 아래는 내 자바 code입니다. 음성 입력을 사용하여 런타임 권한을 추가하고 싶습니다. 많이 시도했지만 여전히 @OnRequestPermission에서 동일한 오류가 발생합니다.
당신이하려는 일을 올바르게 이해하고 있다면, 이것은 실제로 불가능합니다. 오류 메시지에서 알 수 있듯이, Mono for Android 애플리케이션의 활동은 올바르게 작동하기 위해 Mono 런타임에 의존합니다. 호출 가능 랩퍼는 Mono 런타임을 호출하는 얇은 Java 랩퍼 클래스이므로이 경우 자체적으로 유용하지 않습니다. 프로젝트를 빌드 한 후 obj/Debug/android/src 폴더를 보면 실제로 생성 된 호출 가능 랩퍼를 볼 수 있습니다. 예를 들면 다음과 같습니다.
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