자마린(Xamarin)

자마린.안드로이드 강좌(Xamarin.Android), Xamarin.Android EmbeddedJar Binding(안드로…

FSP 0 11 01.28 16:31

자마린.안드로이드 강좌(Xamarin.Android), Xamarin.Android EmbeddedJar Binding(안드로이드 JAR 라이브러리 바인딩)

Xamarin.Android EmbeddedJar Binding(안드로이드 JAR 라이브러리 바인딩)

n Java 라이브러리는 대개 .JAR (Java Archive) 형식으로 패키지화 되지만 Java Bindings 라이브러리에서 .JAR 패키지를 패키지화하여 Xamarin.Android 응용 프로그램에서 해당 기능을 사용할 수 있다.

n Java Bindings 라이브러리의 목적은 .JAR 파일의 API를 자동 생성 코드 래퍼를 통해 C # 코드에서 사용할 수 있도록 하는 것이다.

n Xamarin Tooling(자마린 툴링)은 하나 이상의 입력 .JAR 파일에서 Bindings Library를 생성 할 수 있으며 바인딩 라이브러리 (.DLL 어셈블리)에는 아래 내용이 포함되어 있다.

l 원본 JAR 파일의 내용

l .JAR 파일 내에 Java Type을 래핑하는 C# Type인 Managed Callable Wrappers(MCW), 생성 된 MCW 코드는 JNI (Java Native Interface)를 사용하여 API 호출을 기본 .JAR 파일로 전달한다.

n 기본적으로 안드로이드와 함께 사용하도록 지정된 모든 .JAR 파일에 대한 바인딩 라이브러리를 작성할 수 있지만 Xamarin Tooling(자마린 툴링)은 현재 Android가 아닌 Java 라이브러리 바인딩을 지원하지 않는다.

n DLL이 런타임시 .JAR에 종속되도록 .JAR 파일의 내용을 포함하지 않고 바인딩 라이브러리를 빌드하도록 선택할 수도 있다.

1. 안드로이드 스튜디오에서 새로운 프로젝트를 생성하고 location, application name, company domain 기술하고 다음 페이지 Target Android Device에서“Phone and Tablet” 선택

(안드로이드 최신버전 3.1.4 이상에서는 지원하지 않으므로 SKIP, 실습하려면 하위버전에서 하세요)

n Add an Activity to Mobile 화면에서 “Add No Activity”를 선택 후 “Finish” 클릭

n 자마린으로 바인딩 될 SayHello 인터페이스 및 SayHelloImpl 구현클래스를 작성하자.

n Build.gradle(Module : sayhello)

apply plugin: 'com.android.library'

//task to delete the old jar

task deleteJar(type:Delete){

delete 'libs/sayhello.jar'

}

//task to export contents as jar

task exportJar(type:Copy){

//from('build/intermediates/bundles/release/') //안드로이드 3.1 하위버전

from('build/intermediates/intermediate-jars/release/') //안드로이드 3.1 이상버전

into('libs/')

include('classes.jar')

rename('classes.jar','sayhello.jar')

}

exportJar.dependsOn(deleteJar, build)

android {

compileSdkVersion 28

defaultConfig {

//응용프로그램이 아니라 라이브러리 이므로 생략

//applicationId "com.example.sayhello"

minSdkVersion 15

targetSdkVersion 28

versionCode 1

versionName "1.0"

testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

}

buildTypes {

release {

minifyEnabled false

proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

}

}

}

dependencies {

implementation fileTree(dir: 'libs', include: ['*.jar'])

implementation 'com.android.support:appcompat-v7:28.0.0-rc02'

testImplementation 'junit:junit:4.12'

androidTestImplementation 'com.android.support.test:runner:1.0.2'

androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

}

n 안드로이드 스튜디오 우측의 Gradle을 클릭 후 :sayhello -> Tasks -> other -> exportJar 태스크를 더블 클릭하여 실행(exportJar Task가 보이지 않으면 Gradle Project 상단 좌측의 refresh 버튼을 클릭하자.)

n 이제 sayhello\libs 폴더에 sayhello.jar 파일이 생성되었다.

2. Visual Studio에서 Android à Binding Library(Android) 프로젝트 생성

Bindings Library (BL) Managed Callable Wrappers for Java 유형을 포함하는 어셈블리이므로 C# 호출을 통해 Java 코드를 호출   있다.

이전 프로젝트에서 생성한 sayhello.jar 파일을 Jars 디렉터리에 추가한다Jars -> 추가 -> 기존항목

n Java Bindings 라이브러리 프로젝트를 작성할 때 .JAR 파일이 바인딩 라이브러리에 임베드되는지 또는 별도로 패키지되는지 여부를 “빌드작업(Build Action)” 속성에서 지정해야 한다.

ü EmbeddedJar - .JAR 파일이 라이브러리에 임베드 된다.

ü InputJar - .JAR 파일은 Bindings 라이브러리와 별도로 유지된다.

n EmbeddedJar 형식은 JAR의 Java 바이트 코드가 Dex 바이트 코드로 변환되고 APK에 (Managed Callable Wrappers와 함께) 포함된다.

n .JAR 파일을 바인딩 라이브러리와 별도로 유지하려면 InputJar 옵션을 사용할 수 있지만 응용프로그램을 실행하는 장치에서 .JAR 파일을 사용할 수 있어야 한다.

n 일반적으로 .JAR이 자동으로 바인딩 라이브러리에 포함되어 패키징 되도록 EmbeddedJar 빌드 작업을 사용한다.

솔루션 빌드, 주의 : BL Android 라이브러리와 동일한 또는  이상의 Android API 레벨을 타겟팅 해야한다

3. 이제 C # 코드에서 Java 라이브러리를 사용할  있는데 Xamarin.Android 프로젝트를 생성하자. Android -> 비어있는 (blank app) 선택 프로젝트 이름을 “UseSayHello라고 하자.

activity_main 더블클릭 하여 아래와 같이 화면을 만들자. (button, Text(Large) 두개의 컨트롤을 사용하며 컨트롤의 이름은 default 두자.)

n BL(바인딩 라이브러리) 프로젝트를 참조추가 하자. 참조 -> 참조추가, 찾아보기에서 C:\xamarin project\SayHello\SayHello\bin\Debug의 SayHello.dll을 참조추가 하면 된다.

아래 MainActivity 코드에서 자바쪽에서 만든 SayHello 사용했다.

using Android.App;

using Android.Widget;

using Android.OS;

// 원래 자바에서 소문자로 패키지를 만들었지만 바인딩 라이브러리에

// 포함될때 단어의 첫글자가 대문자로 변환된다.

using Com.Example.Sayhello;

namespace UseSayHello

{

[Activity(Label = "UseSayHello",

MainLauncher = true,

Icon = "@drawable/icon")]

public class MainActivity : Activity

{

// 자바의 SayHello 인터페이스는 이름앞에

// I가 붙어서 바인딩 된다.

ISayHello hello;

protected override void OnCreate(Bundle bundle)

{

base.OnCreate(bundle);

// Set our view from the "main" layout resource

SetContentView (Resource.Layout.Main);

hello = new SayHelloImpl();

Button button1 = FindViewById<Button>(Resource.Id.button1);

TextView textView1 = FindViewById<TextView>(Resource.Id.textView1);

// 자바에서 sayHello라는 메소드 명으로 만들었지만

// 바인딩 라이브러리에 포함될 때 SayHello로 변경됨.

button1.Click += (sender, args) =>

textView1.Text = hello.SayHello("이종철");

}

}

}

실행결과

 

#JAR바인딩, #바인딩라이브러리, #자마린, #자마린교육, #자마린강좌, #Xamarin, #Xamarin교육, #자마린강의, #XamarinForms 

, , , , , , , ,

Comments