Java 라이브러리 바인딩Binding a Java Library

Android 커뮤니티에는 앱에서 사용 하려는 여러 Java 라이브러리가 있습니다. 이 가이드에서는 바인딩 라이브러리를 만들어 Xamarin Android 응용 프로그램에 Java 라이브러리를 통합 하는 방법에 대해 설명 합니다.The Android community has many Java libraries that you may want to use in your app; this guide explains how to incorporate Java libraries into your Xamarin.Android application by creating a Bindings Library.

개요Overview

Android 용 타사 라이브러리 에코 시스템은 광범위 합니다.The third-party library ecosystem for Android is massive. 따라서 기존 Android 라이브러리를 사용 하 여 새 Android 라이브러리를 만드는 것이 일반적입니다.Because of this, it frequently makes sense to use an existing Android library than to create a new one. Xamarin.ios는 이러한 라이브러리를 사용 하는 두 가지 방법을 제공 합니다.Xamarin.Android offers two ways to use these libraries:

  • 호출을 통해 C# Java 코드를 호출할 수 있도록 래퍼 C# 를 사용 하 여 라이브러리를 자동으로 래핑하는 바인딩 라이브러리 를 만듭니다.Create a Bindings Library that automatically wraps the library with C# wrappers so you can invoke Java code via C# calls.

  • JNI( java Native Interface )를 사용 하 여 java 라이브러리 코드에서 직접 호출을 호출 합니다.Use the Java Native Interface (JNI) to invoke calls in Java library code directly. JNI는 Java 코드를 호출 하 고 네이티브 응용 프로그램 또는 라이브러리에서 호출할 수 있도록 하는 프로그래밍 프레임 워크입니다.JNI is a programming framework that enables Java code to call and be called by native applications or libraries.

이 가이드에서는 첫 번째 옵션인, 하나 이상의 기존 Java 라이브러리를 응용 프로그램에서 연결할 수 있는 어셈블리로 래핑하는 바인딩 라이브러리 를 만드는 방법에 대해 설명 합니다.This guide explains the first option: how to create a Bindings Library that wraps one or more existing Java libraries into an assembly that you can link to in your application. JNI 사용에 대 한 자세한 내용은 JNI 작업을 참조 하세요.For more information about using JNI, see Working with JNI.

Xamarin Android는mcw( 관리 되는 호출 가능 래퍼 )를 사용 하 여 바인딩을 구현 합니다.Xamarin.Android implements bindings by using Managed Callable Wrappers (MCW). MCW는 관리 코드에서 Java 코드를 호출 해야 할 때 사용 되는 JNI 브리지입니다.MCW is a JNI bridge that is used when managed code needs to invoke Java code. 또한 관리 되는 호출 가능 래퍼는 java 형식의 하위 클래스를 지원 하 고 Java 형식의 가상 메서드를 재정의 하는 기능을 제공 합니다.Managed callable wrappers also provide support for subclassing Java types and for overriding virtual methods on Java types. 마찬가지로, Android runtime (ART) 코드에서 관리 코드를 호출 하려는 경우 ACW (Android 호출 가능 래퍼) 라고 하는 다른 JNI bridge를 통해 수행 합니다.Likewise, whenever Android runtime (ART) code wishes to invoke managed code, it does so via another JNI bridge known as Android Callable Wrappers (ACW). 아키텍처 는 다음 다이어그램에 설명 되어 있습니다.This architecture is illustrated in the following diagram:

Android JNI 브리지 아키텍처Android JNI bridge architecture

바인딩 라이브러리는 Java 형식에 대 한 관리 되는 호출 가능 래퍼를 포함 하는 어셈블리입니다.A Bindings Library is an assembly containing Managed Callable Wrappers for Java types. 예를 들어 다음은 바인딩 라이브러리에서 래핑할 Java 형식인 MyClass입니다.For example, here is a Java type, MyClass, that we want to wrap in a Bindings Library:

package com.xamarin.mycode;

public class MyClass
{
    public String myMethod (int i) { ... }
}

MyClass포함 된 jar 에 대 한 바인딩 라이브러리를 생성 한 후에는에서이를 인스턴스화하고에서 C#메서드를 호출할 수 있습니다.After we generate a Bindings Library for the .jar that contains MyClass, we can instantiate it and call methods on it from C#:

var instance = new MyClass ();

string result = instance.MyMethod (42);

이 바인딩 라이브러리를 만들려면 Xamarin.ios Java 바인딩 라이브러리 템플릿을 사용 합니다.To create this Bindings Library, you use the Xamarin.Android Java Bindings Library template. 결과 바인딩 프로젝트는 MCW 클래스, jar 파일 및 리소스에 포함 된 Android 라이브러리 프로젝트용 리소스를 사용 하 여 .net 어셈블리를 만듭니다.The resulting binding project creates a .NET assembly with the MCW classes, .jar file(s), and resources for Android Library projects embedded in it. Android 보관에 대 한 바인딩 라이브러리 ()를 만들 수도 있습니다. AAR) 파일 및 Eclipse Android 라이브러리 프로젝트You can also create Bindings Libraries for Android Archive (.AAR) files and Eclipse Android Library projects. 결과 바인딩 라이브러리 DLL 어셈블리를 참조 하 여 Xamarin Android 프로젝트에서 기존 Java 라이브러리를 다시 사용할 수 있습니다.By referencing the resulting Bindings Library DLL assembly, you can reuse an existing Java library in your Xamarin.Android project.

바인딩 라이브러리의 형식을 참조 하는 경우 바인딩 라이브러리의 네임 스페이스를 사용 해야 합니다.When you reference types in your Binding Library, you must use the namespace of your binding library. 일반적으로 .NET 네임 스페이스 버전의 Java 패키지 이름인 C# 소스 파일의 맨 위에 using 지시문을 추가 합니다.Typically, you add a using directive at the top of your C# source files that is the .NET namespace version of the Java package name. 예를 들어, 다음과 같은 경우에는 바인딩된 jar 의 Java 패키지 이름을 사용할 수 있습니다.For example, if the Java package name for your bound .jar is the following:

com.company.package

그런 다음 C# 소스 파일의 맨 위에 다음 using 문을 추가 하 여 bound 파일의 형식에 액세스 합니다 .Then you would put the following using statement at the top of your C# source files to access types in the bound .jar file:

using Com.Company.Package;

기존 Android 라이브러리를 바인딩할 때는 다음 사항을 염두에 두어야 합니다.When binding an existing Android library, it is necessary to keep the following points in mind:

  • 라이브러리에 대 한 외부 종속성이 있나요?Are there any external dependencies for the library? Android 라이브러리에 필요한 모든 Java 종속성 – ReferenceJar 또는 EmbeddedReferenceJar로 Xamarin android 프로젝트에 포함 되어야 합니다.– Any Java dependencies required by the Android library must be included in the Xamarin.Android project as a ReferenceJar or as an EmbeddedReferenceJar. 모든 네이티브 어셈블리를 바인딩 프로젝트에 EmbeddedNativeLibrary로 추가 해야 합니다.Any native assemblies must be added to the binding project as an EmbeddedNativeLibrary.

  • Android 라이브러리 대상의 Android API 버전은 무엇 인가요?What version of the Android API does the Android library target? – Android API 수준을 "다운 그레이드" 할 수 없습니다. Xamarin Android 바인딩 프로젝트가 Android 라이브러리와 동일한 API 수준 (또는 그 이상)을 대상으로 하는지 확인 합니다.– It is not possible to "downgrade" the Android API level; ensure that the Xamarin.Android binding project is targeting the same API level (or higher) as the Android library.

  • 라이브러리를 컴파일하는 데 사용 된 JDK 버전은 무엇 인가요?What version of the JDK was used to compile the library? Android 라이브러리가 Xamarin.ios에서 사용 하는 것과 다른 버전의 JDK로 빌드된 경우 – 바인딩 오류가 발생할 수 있습니다.– Binding errors may occur if the Android library was built with a different version of JDK than in use by Xamarin.Android. 가능 하면 Xamarin.ios 설치에 사용 되는 것과 동일한 버전의 JDK를 사용 하 여 Android 라이브러리를 다시 컴파일하십시오.If possible, recompile the Android library using the same version of the JDK that is used by your installation of Xamarin.Android.

빌드 작업Build Actions

바인딩 라이브러리를 만들 때 jar 또는에 대 한 빌드 작업 을 설정 합니다. AAR 파일을 바인딩 라이브러리 프로젝트에 통합 하는 경우 각 빌드 작업 –는 jar 또는의 방법을 결정 합니다. AAR 파일은 바인딩 라이브러리에 포함 되거나 바인딩 라이브러리에 의해 참조 됩니다.When you create a Bindings Library, you set build actions on the .jar or .AAR files that you incorporate into your Bindings Library project – each build action determines how the .jar or .AAR file will be embedded into (or referenced by) your Bindings Library. 다음 목록에서는 이러한 빌드 작업을 요약 합니다.The following list summarizes these build actions:

  • EmbeddedJar 결과 바인딩 라이브러리 DLL에 jar를 포함 리소스로 포함 – .EmbeddedJar – Embeds the .jar into the resulting Bindings Library DLL as an embedded resource. 가장 간단 하 고 가장 일반적으로 사용 되는 빌드 작업입니다.This is the simplest and most commonly-used build action. Jar 를 자동으로 바이트 코드로 컴파일하고 바인딩 라이브러리에 패키지 하려는 경우이 옵션을 사용 합니다.Use this option when you want the .jar automatically compiled into byte code and packaged into the Bindings Library.

  • InputJar – 결과 바인딩 라이브러리에 jar 을 포함 하지 않습니다. GDIPLUS.DLL.InputJar – Does not embed the .jar into the resulting Bindings Library .DLL. 바인딩 라이브러리입니다. DLL은 런타임에이 jar 에 종속 됩니다.Your Bindings Library .DLL will have a dependency on this .jar at runtime. 바인딩 라이브러리에 jar 를 포함 하지 않으려는 경우 (예: 라이선스의 경우)이 옵션을 사용 합니다.Use this option when you do not want to include the .jar in your Bindings Library (for example, for licensing reasons). 이 옵션을 사용 하는 경우 앱을 실행 하는 장치에서 입력 jar 를 사용할 수 있는지 확인 해야 합니다.If you use this option, you must ensure that the input .jar is available on the device that runs your app.

  • LibraryProjectZip – 포함 됩니다. AAR 파일을 결과 바인딩 라이브러리로 변환 합니다. GDIPLUS.DLL.LibraryProjectZip – Embeds an .AAR file into the resulting Bindings Library .DLL. 이는 바인딩된의 코드 및 리소스에 액세스할 수 있다는 점을 제외 하 고 EmbeddedJar와 비슷합니다. AAR 파일입니다.This is similar to EmbeddedJar, except that you can access resources (as well as code) in the bound .AAR file. 을 포함 하려는 경우이 옵션을 사용 합니다. 바인딩 라이브러리로 AAR.Use this option when you want to embed an .AAR into your Bindings Library.

  • ReferenceJar –에서 참조를 지정 합니다. jar: 참조 jar 는 바인딩된 jar 또는입니다. AAR 파일은에 따라 달라 집니다.ReferenceJar – Specifies a reference .jar: a reference .jar is a .jar that one of your bound .jar or .AAR files depends on. 이 참조 jar 는 컴파일 타임 종속성을 충족 하는 데만 사용 됩니다.This reference .jar is used only to satisfy compile-time dependencies. 이 빌드 작업을 사용 하는 C# 경우 참조 jar 에 대 한 바인딩이 생성 되지 않으며 결과 바인딩 라이브러리에 포함 되지 않습니다. GDIPLUS.DLL.When you use this build action, C# bindings are not created for the reference .jar and it is not embedded in the resulting Bindings Library .DLL. 참조에 대 한 바인딩 라이브러리를 만들지만 아직 수행 하지 않은 경우이 옵션을 사용 합니다.Use this option when you will make a Bindings Library for the reference .jar but have not done so yet. 이 빌드 작업은 여러 .jars (및/또는)를 패키징하는 데 유용 합니다. AARs)를 상호 의존적인 여러 바인딩 라이브러리로 변환 합니다.This build action is useful for packaging multiple .jars (and/or .AARs) into multiple interdependent Bindings Libraries.

  • EmbeddedReferenceJar 결과 바인딩 라이브러리에 참조 jar 를 포함 –. GDIPLUS.DLL.EmbeddedReferenceJar – Embeds a reference .jar into the resulting Bindings Library .DLL. 입력 C# jar (또는)에 대 한 바인딩을 만들려는 경우이 빌드 작업을 사용 합니다. AAR) 및 모든 참조 jar를 바인딩 라이브러리에 있습니다.Use this build action when you want to create C# bindings for both the input .jar (or .AAR) and all of its reference .jar(s) in your Bindings Library.

  • EmbeddedNativeLibrary – 네이티브 . 를 바인딩에 포함 합니다.EmbeddedNativeLibrary – Embeds a native .so into the binding. 이 빌드 작업은에 사용 되므로 jar 파일에 필요한 파일을 바인딩합니다.This build action is used for .so files that are required by the .jar file being bound. Java 라이브러리에서 코드를 실행 하기 전에 라이브러리를 수동으로 로드 해야 할 수도 있습니다.It may be necessary to manually load the .so library before executing code from the Java library. 이 내용은 아래에 설명 되어 있습니다.This is described below.

이러한 빌드 작업은 다음 가이드에 자세히 설명 되어 있습니다.These build actions are explained in more detail in the following guides.

또한 다음과 같은 빌드 작업을 사용 하 여 Java API 설명서를 가져오고 C# XML 문서로 변환할 수 있습니다.Additionally, the following build actions are used to help importing Java API documentation and convert them into C# XML documentation:

  • JavaDocJar는 Maven 패키지 스타일 (일반적으로 FOOBAR-javadoc**.jar**)을 준수 하는 Java 라이브러리의 Javadoc archive Jar를 가리키는 데 사용 됩니다.JavaDocJar is used to point to Javadoc archive Jar for a Java library that conforms to a Maven package style (usually FOOBAR-javadoc**.jar**).
  • JavaDocIndex는 API 참조 문서 HTML에서 index.html 파일을 가리키는 데 사용 됩니다.JavaDocIndex is used to point to index.html file within the API reference documentation HTML.
  • JavaSourceJar는 먼저 원본에서 JavaDoc를 생성 한 다음 Maven 패키지 스타일 (일반적으로 FOOBAR-sources**.jar**)을 준수 하는 Java 라이브러리에 대해 결과를 JavaDocIndex로 처리 하기 위해 JavaDocJar를 보완 하는 데 사용 됩니다.JavaSourceJar is used to complement JavaDocJar, to first generate JavaDoc from sources and then treat the results as JavaDocIndex, for a Java library that conforms to a Maven package style (usually FOOBAR-sources**.jar**).

API 설명서는 Java8, Java7 또는 Java6 SDK (모두 다른 형식) 또는 DroidDoc 스타일의 기본 doclet 합니다.The API documentation should be the default doclet from Java8, Java7 or Java6 SDK (they are all different format), or the DroidDoc style.

바인딩에 네이티브 라이브러리 포함Including a Native Library in a Binding

Java 라이브러리 바인딩의 일부로 Xamarin.ios 바인딩 프로젝트에 . 의 라이브러리를 포함 해야 할 수도 있습니다.It may be necessary to include a .so library in a Xamarin.Android binding project as a part of binding a Java library. 래핑된 Java 코드가 실행 되 면 Xamarin.ios는 JNI 호출을 수행 하지 않고 오류 메시지 UnsatisfiedLinkError: Native method를 찾을 수 없습니다. 는 응용 프로그램에 대해 logcat out에 표시 됩니다.When the wrapped Java code executes, Xamarin.Android will fail to make the JNI call and the error message java.lang.UnsatisfiedLinkError: Native method not found: will appear in the logcat out for the application.

이 문제를 해결 하려면 Java.Lang.JavaSystem.LoadLibrary를 호출 하 여. 라이브러리를 수동으로 로드 해야 합니다 .The fix for this is to manually load the .so library with a call to Java.Lang.JavaSystem.LoadLibrary. 예를 들어 Xamarin.ios 프로젝트에 shared library libpocketsphinx_jni 가 있다고 가정 하면 EmbeddedNativeLibrary의 빌드 작업을 사용 하 여 바인딩 프로젝트에 포함 된 다음 코드 조각 (공유 라이브러리를 사용 하기 전에 실행 됨) 는를 로드 합니다. 라이브러리:For example assuming that a Xamarin.Android project has shared library libpocketsphinx_jni.so included in the binding project with a build action of EmbeddedNativeLibrary, the following snippet (executed before using the shared library) will load the .so library:

Java.Lang.JavaSystem.LoadLibrary("pocketsphinx_jni");

C⧣에 Java Api 적용Adapting Java APIs to C⧣

Xamarin Android 바인딩 생성기는 .NET 패턴에 해당 하는 일부 Java 관용구 및 패턴을 변경 합니다.The Xamarin.Android Binding Generator will change some Java idioms and patterns to correspond to .NET patterns. 다음 목록에서는 Java가/.Net에 C#매핑되는 방법을 설명 합니다.The following list describes how Java is mapped to C#/.NET:

  • Java의 Setter/Getter 메서드 는 .Net의 속성 입니다.Setter/Getter methods in Java are Properties in .NET.

  • Java의 필드 는 .Net의 속성 입니다.Fields in Java are Properties in .NET.

  • Java의 수신기/수신기 인터페이스 는 .Net의 이벤트 입니다.Listeners/Listener Interfaces in Java are Events in .NET. 콜백 인터페이스에 있는 메서드의 매개 변수는 EventArgs 하위 클래스로 표시 됩니다.The parameters of methods in the callback interfaces will be represented by an EventArgs subclass.

  • Java의 정적 중첩 클래스 는 .Net의 중첩 된 클래스 입니다.A Static Nested class in Java is a Nested class in .NET.

  • Java의 내부 클래스 는의 C#인스턴스 생성자를 사용 하는 중첩 클래스 입니다.An Inner class in Java is a Nested class with an instance constructor in C#.

바인딩 시나리오Binding Scenarios

다음 바인딩 시나리오 가이드를 참조 하 여 앱에 통합 하기 위해 Java 라이브러리 (또는 라이브러리)를 바인딩할 수 있습니다.The following binding scenario guides can help you bind a Java library (or libraries) for incorporation into your app:

  • 바인딩. JARjar 파일에 대 한 바인딩 라이브러리를 만들기 위한 연습입니다.Binding a .JAR is a walkthrough for creating Bindings Libraries for .jar files.

  • 바인딩. AAR 은에 대 한 바인딩 라이브러리를 만들기 위한 연습입니다. AAR 파일.Binding an .AAR is a walkthrough for creating Bindings Libraries for .AAR files. Android Studio 라이브러리를 바인딩하는 방법에 대 한 자세한 내용은이 연습을 참조 하세요.Read this walkthrough to learn how to bind Android Studio libraries.

  • Eclipse 라이브러리 프로젝트를 바인딩하 는 연습은 Android 라이브러리 프로젝트에서 바인딩 라이브러리를 만드는 데 사용할 수 있습니다.Binding an Eclipse Library Project is a walkthrough for creating binding libraries from Android Library Projects. Eclipse Android 라이브러리 프로젝트를 바인딩하는 방법을 알아보려면이 연습을 참조 하세요.Read this walkthrough to learn how to bind Eclipse Android Library Projects.

  • 바인딩을 사용자 지정 하는 방법에 대 한 자세한C#내용은 바인딩을 수동으로 수정 하 여 빌드 오류를 해결 하 고 결과 API를 모양을 지정 하는 방법을 설명 합니다.Customizing Bindings explains how to make manual modifications to the binding to resolve build errors and shape the resulting API so that it is more "C#-like".

  • 바인딩 문제 해결 에서는 일반적인 바인딩 오류 시나리오를 나열 하 고, 가능한 원인을 설명 하 고, 이러한 오류를 해결 하기 위한 제안 사항을 제공 합니다.Troubleshooting Bindings lists common binding error scenarios, explains possible causes, and offers suggestions for resolving these errors.