2019년 1월 27일 일요일

자마린.안드로이드(기존 안드로이드, 자바와 연동하기 위한 바인딩 라이브러리 만들기) .JAR, .AAR, Native Android Library 바인딩

자마린.안드로이드(기존 안드로이드, 자바와 연동하기 위한 바인딩 라이브러리 만들기) .JAR, .AAR, Native Android Library 바인딩
Xamarin.Android(With .JAR, .AAR, Native Android Library)
Binding Java Library(Consuming Java libraries from C#)
Android 커뮤니티에는 앱에서 사용할 수있는 많은 자바 라이브러리가 있다바인딩 라이브러리를 만들어 Java 라이브러리를 Xamarin.Android 응용 프로그램에통합하는 방법에 대해 알아보자
n Android용 라이브러리는 방대하기 때문에 새로운 Android 라이브러리를 만드는 것보다 기존 라이브러리를 사용하는 것이 좋다. Xamarin.Android는 이러한 라이브러리를 사용하는 두 가지 방법을 제공한다.
자마린(C#)에서 Java 코드를 호출   있도록 C# 래퍼로 라이브러리를 자동으로 래핑하는 바인딩 라이브러리를 만드는 방법과 Java Native Interface (JNI)사용하여 Java 라이브러리를 직접 호출을 호출하는 방법이 있다. JNI Java 코드가 네이티브 응용 프로그램 또는 라이브러리에 의해 호출  수있게 해주는 프레임워크이다.
n 아래는 첫 번째 방법인 하나 이상의 기존 Java 라이브러리를 응용 프로그램에 연결할 수있는 어셈블리로 래핑하는 Bindings 라이브러리를 만드는 방법에 대한 설명이다.
n Xamarin.Android는 Managed Callable Wrappers (MCW)를 사용하여 바인딩을 구현하는데 MCW는 Java 코드를 호출해야 할 때 사용되는 JNI 브리지로 호출 가능 래퍼는 Java 유형의 서브 클래스 작성 및 Java 유형의 가상 메소드 대체를 지원한다.
n 마찬가지로 Android 런타임 (ART) 코드가 관리 코드(C#)를 호출하기를 원한다면 Android Callable Wrappers (ACW)라고하는 다른 JNI 브리지를 통해 코드를 호출한다. 아래 다이어그램을 참조하자.
Bindings 라이브러리는 Managed Callable Wrappers(MCW) for Java 유형을 포함하는 어셈블리이다예를 들어다음은 Bindings 라이브러리에서 랩핑 하려는Java 유형 MyClass.
package com.xamarin.mycode;
public class MyClass
{
public String myMethod (int i) { ... }
}
n C#쪽에서 MyClass가 포함 된 .jar 용 Bindings Library를 생성 한 후에 객체를 만들고 메소드를 호출 할 수 있다.
var instance = new MyClass ();
string result = instance.myMethod (42);
n Bindings 라이브러리를 만들려면 Xamarin.Android Java Bindings Library 템플릿을 사용하는데 결과로 생성 된 바인딩 프로젝트는 MCW 클래스, .jar 파일 및 Android 라이브러리 프로젝트에 포함 된 리소스가 포함 된 .NET 어셈블리를 만든다.
JAR, AAR, DEX, APK 차이점
JAR (Java Archive) : JAR는 해당 플랫폼에서 JAVA 응용 프로그램을 배포하기 위해 고안된 패키지 파일 형식. 컴파일 된 자바 클래스 파일과 MANIFEST와 같은 파일들이 포함되며 기본적으로 ZIP 아카이브 형태이다.
AAR (Android Archive) : Android 라이브러리 프로젝트의 바이너리 배포판입니다. 주로 Java클래스 파일들만 포함하는 Jar와 달리 리소스 파일들도 포함하고 있으며 이클립스 + 안드로이드 플러그인 형태의 개발에서는 사용불가하며 안드로이드 스튜디오 개발에서에서 사용 가능하다.
DEX (Dalvik Excutable) : Java 코드로 작성되어 컴파일된 클래스 파일을 DX(Android dx tool) 도구를 사용해 변환한 파일로 DVM(Dalvik Virtual Machine)을 위한 실행 파일이다. Java 바이트 코드는 달빅 바이트 코드로 변환되며 여러 클래스 파일에 들어있는 중복된 코드들을 재사용하기 때문에 JAR(Java archive) 파일에 비해 필요한 공간이 절반 정도로 크게 줄어든다. Android SDK의 Dex 컴파일러에 의해 JVM 바이트코드를 DVM 바이트코드로 변환하고 모든 클래스파일들을 Dex 파일에 넣는다. DEX는 바이너리 파일 형식으로 컴파일 된다.
안드로이드는 실행 파일 수행에 있어 달빅 가상머신(Dalvik VM)을 사용한다. 달빅 가상머신 상에서 수행되는 애플리케이션들은 각각 분리된 프로세스와 ID를 갖고 있으며 분리된 VM 영역에서 실행된다. 윈도우 환경에서의 실행 파일인 PE(Portable Executable) 파일이 있듯이, 안드로이드 환경하에서도 실행 파일인 DEX(Dalvik Excutable) 파일이 있다. 안드로이드는 이 DEX 파일을 달빅 가상머신에서 구동시킨다. 달빅 가상머신은 모바일 기기에서 용량이 적은 메모리를 사용해 실행 파일을 구동할 수 있게 최적화한 가상머신이다. 동시에 여러 가상머신을 실행할 수 있도록 설계돼 있다. 다시 말해 안드로이드 OS는 실행되는 애플리케이션마다 가상머신을 생성해 구동시티는 것이다.
APK (Android Application Package) : 안드로이드 플랫폼에 배포할 수 있도록 설계된 파일 형식으로 확장자는 .apk 이고 ZIP파일 기반인 JAR를 기반으로 한다. 그래서 이 때문에 7-Zip, Alzip 등 압축 프로그램으로 내용을 확인할 수 있다. AndroidManifest.xml 등 리소스 파일들도 포함하는데 이 파일은 APK 내 최상위 폴더에 위치해 있으며 애플리케이션에 필요한 퍼미션(Permossion) 설정 정보를 담고 있다. 주요 컴포넌트(Component) 즉 Activity, Service, Broadcast Receiver, Content Provider에 대한 동작 설정 정보도 포함하고 있다.
n Android 보관 파일 (.AAR) 파일과 Eclipse Android 라이브러리 프로젝트 용 Bindings Libraries를 만들 수도 있다. 결과로 생성 된 Bindings Library DLL 어셈블리를 참조하면 Xamarin.Android 프로젝트에서 기존 Java 라이브러리를 다시 사용할 수 있다.
n 바인딩 라이브러리에서 형식을 참조 할 때는 바인딩 라이브러리의 네임 스페이스를 사용해야하고 일반적으로 Java 패키지 이름의 .NET 네임 스페이스 버전 인 C# 소스 파일의 맨 위에 using 지시문을 추가한다. 예를 들어, 바인드 된 .jar의 Java 패키지 이름이 “a.b.c” 라면 “using a.b.c”를 추가하면 된다.
n Android 라이브러리를 바인딩 할 때 다음 사항에 유의해야 한다.
라이브러리에 대한 외부 종속성이 있는가? - Android 라이브러리에 필요한 모든 Java 종속성은 Xamarin.Android 프로젝트에 ReferenceJar 또는 EmbeddedReferenceJar로 포함되어야 하며 모든 네이티브 어셈블리는 EmbeddedNativeLibrary로 바인딩 프로젝트에 추가 되어야 한다.
Android 라이브러리는 어떤 Android API 버전을 타겟팅 하는가? - Android API 레벨을 "다운 그레이드"할 수는 없다. Xamarin.Android 바인딩 프로젝트가 Android 라이브러리와 동일한 API 수준 (또는 그 이상)을 타겟팅하는지 확인해야 한다.
라이브러리를 컴파일하는 데 사용 된 JDK의 버전은 무엇인가? - Android 라이브러리가 Xamarin.Android에서 사용중인 JDK와 다른 버전으로 작성된 경우 바인딩 오류가 발생할 수 있다. 가능한 경우 Xamarin.Android를 설치하는 데 사용되는 JDK와 동일한 버전의 JDK를 사용하여 Android 라이브러리를 다시 컴파일 하는 것이 좋다.
n Bindings Library를 생성 할 때 Bindings Library 프로젝트에 통합하는 .jar 또는 .AAR 파일에 대한 빌드 작업(Build Action)을 설정하는데 각 빌드 작업은 .jar 또는 .AAR 파일이 사용자의 Bindings 라이브러리에 포함되거나 참조되는 방식을 결정한다.
ü EmbeddedJar - 포함 된 자원으로 .jar를 결과 Bindings Library DLL에 삽입, 가장 간단하고 가장 일반적으로 사용되는 빌드 작업이다. .jar를 자동으로 바이트 코드로 컴파일하고 Bindings 라이브러리에 패키지화 하려면 이 옵션을 사용한다.
ü InputJar - 결과 Bindings 라이브러리 .DLL에 .jar를 내장하지 않으며 Bindings 라이브러리 .DLL은 런타임에 .jar에 종속되는 형태이다. Bindings Library에 .jar를 포함하지 않으려는 경우 (예 : 라이센스상의 이유로)이 옵션을 사용하면 되는데 이 옵션을 사용하는 경우 입력 .jar이 앱을 실행하는 기기에서 사용 가능한지 확인해야 한다.
ü LibraryProjectZip - .AAR 파일을 결과 Bindings 라이브러리 .DLL에 포함한다. 이는 바인딩 된 .AAR 파일의 리소스 (코드는 물론)에 액세스 할 수 있다는 점을 제외하고는 EmbeddedJar와 유사하다. .AAR을 Bindings Library에 임베디드 하려면이 옵션을 사용한다.
ü ReferenceJar - .jar에 대한 참조를 지정한다. 바인딩 된 .jar 또는 .AAR 파일 중 하나가 의존하는 .jar를 가리킨다. 이 참조 .jar은 컴파일 타임 의존성을 만족시키기 위해서만 사용하며 이 빌드 동작을 사용하면 참조하는 .jar에 대한 C# 바인딩이 만들어지지 않고 결과 Bindings 라이브러리 .DLL에 포함되지 않는다. 참조하는 .jar에 대한 바인딩 라이브러리를 만들지만 아직 수행하지 않은 경우 이 옵션을 사용하며 여러 .jar (및 / 또는 .AAR)를 여러 상호 의존 Bindings 라이브러리로 패키징하는 데 유용하다.
ü EmbeddedReferenceJar - 참조하는 .jar를 결과 Bindings 라이브러리 .DLL에 포함한다. 입력 .jar (또는 .AAR)과 Bindings 라이브러리의 모든 참조 .jar (둘 다)에 대해 C# 바인딩을 만들려는 경우에 사용한다.
ü EmbeddedNativeLibrary - 네이티브 .so를 바인딩에 포함한다. 바인딩되는 .jar 파일에 필요한 .so 파일에 사용하며 Java 라이브러리에서 코드를 실행하기 전에 .so 라이브러리를 수동으로 로드해야 할 수도 있다. 아래 내용을 참조하자.
Including a Native Library in a Binding
ü Java 라이브러리를 바인딩하는 일부로 .so 라이브러리를 Xamarin.Android 바인딩 프로젝트에 포함해야 할 수도 있는데 간혹 래핑 된 Java 코드가 실행되면 Xamarin.Android가 JNI 호출을 수행하지 못하고 java.lang.UnsatisfiedLinkError : Native method not found 오류 메시지가 응용 프로그램의 logcat 출력에 나타날 수 있다.
ü 이 경우 Java.Lang.JavaSystem.LoadLibrary를 호출하여 .so 라이브러리를 수동으로 로드해야 한다. 예를 들어, Xamarin.Android 프로젝트가 EmbeddedNativeLibrary 빌드 작업으로 바인딩 프로젝트에 포함 된 라이브러리 libpocketsphinx_jni.so를 공유한다고 가정하면 공유 라이브러리를 사용하기 전에 다음 방법으로 .so 라이브러리를 로드한다.
Java.Lang.JavaSystem.LoadLibrary("pocketsphinx_jni");
Adapting Java APIs to C⧣
ü Xamarin.Android Binding Generator는 .NET 패턴과 일치하도록 일부 Java 관용구 및 패턴을 변경하는데 아래는 Java가 C# / .NET에 매핑되는 방법을 설명한다.
ü Java의 Setter / Getter 메소드는 .NET의 속성이다.
ü Java의 필드는 .NET의 속성이다.
ü Java의 Listener / Listener 인터페이스는 .NET의 이벤트이며 콜백 인터페이스의 메서드 매개 변수는 EventArgs 하위 클래스로 표시된다.
ü Java의 Static Nested 클래스는 .NET의 Nested 클래스 이다.
ü Java의 Inner 클래스는 C#에서 인스턴스 생성자가 있는 Nested 클래스 이다.
Binding Example
ü .JAR 바인딩은 .jar 파일에 대한 바인딩 이다.(https://developer.xamarin.com/guides/android/advanced_topics/binding-a-java-library/binding-a-jar )
ü .AAR 바인딩은 .AAR 파일에 대한 바인딩 라이브러리를 만들기위한 방법으로 Android Studio 라이브러리를 바인딩 하려면 방법을 사용한다.(https://developer.xamarin.com/guides/android/advanced_topics/binding-a-java-library/binding-an-aar/ )
ü 이클립스 라이브러리 프로젝트 바인딩은 Android 라이브러리 프로젝트에서 바인딩 라이브러리를 만들 때 사용하며 Eclipse Android Library Project를 바인딩 할 때 사용한다.(https://developer.xamarin.com/guides/android/advanced_topics/binding-a-java-library/binding-a-library-project/ )
ü Bindings 커스터마이징에서는 빌드 오류를 해결하고 결과로 나오는 API를 구조화 하기위해 바인딩을 수동으로 수정하는 방법을 설명하여 "C#과 유사"합니다.(https://developer.xamarin.com/guides/android/advanced_topics/binding-a-java-library/customizing-bindings/ )

댓글 없음:

댓글 쓰기

(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...