바인딩 문제 해결Troubleshooting Bindings

이 문서에서는 바인딩을 생성할 때 발생할 수 있는 여러 일반적인 오류를 요약 하 고 가능한 원인과 해결 방법을 설명 합니다.This article summarizes serveral common errors that may occur when generating bindings, along with possible causes and suggested ways to resolve them.

개요Overview

Android 라이브러리 ( aar 또는 .jar) 파일을 바인딩하는 것은 거의 번거롭고 되지 않습니다. Java와 .NET 간의 차이로 인해 발생 하는 문제를 완화 하기 위해 일반적으로 추가 작업이 필요 합니다.Binding an Android library (an .aar or a .jar) file is seldom a straightforward affair; it usually requires additional effort to mitigate issues that result from the differences between Java and .NET. 이러한 문제로 인해 Xamarin.ios는 Android 라이브러리를 바인딩하지 않으며 빌드 로그에 오류 메시지로 표시 됩니다.These issues will prevent Xamarin.Android from binding the Android library and present themselves as error messages in the build log. 이 가이드에서는 문제 해결을 위한 몇 가지 팁을 제공 하 고, 몇 가지 일반적인 문제/시나리오를 나열 하 고, Android 라이브러리를 성공적으로 바인딩할 수 있는 가능한 솔루션을 제공 합니다.This guide will provide some tips for troubleshooting the issues, list some of the more common problems/scenarios, and provide possible solutions to successfully binding the Android library.

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

  • Android 라이브러리에 필요한 모든 Java 종속성 – 라이브러리의 외부 종속성은 ReferenceJar 프로젝트에 EmbeddedReferenceJar로 포함 되어야 합니다.The external dependencies for the library – Any Java dependencies required by the Android library must be included in the Xamarin.Android project as a ReferenceJar or as an EmbeddedReferenceJar.

  • Android 라이브러리에서 대상으로 하는 ANDROID api 수준 – android api 수준을 "다운 그레이드" 할 수 없습니다. Xamarin Android 바인딩 프로젝트가 Android 라이브러리와 동일한 API 수준 (또는 그 이상)을 대상으로 하는지 확인 합니다.The Android API level that the Android library is targetting – 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.

  • Android 라이브러리를 패키지 하는 데 사용 된 ANDROID JDK 버전이 xamarin.ios에서 사용 중인 것과 다른 버전의 JDK로 빌드된 경우에 발생할 수 있습니다 – 바인딩 오류는 android 라이브러리입니다.The version of the Android JDK that was used to package the Android library – Binding errors may occur if the Android library was built with a different version of JDK than the one 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.

Xamarin Android 라이브러리 바인딩과 관련 된 문제를 해결 하는 첫 번째 단계는 진단 MSBuild 출력을 사용 하는 것입니다.The first step to troubleshooting issues with binding a Xamarin.Android library is to enable diagnostic MSBuild output. 진단 출력을 사용 하도록 설정한 후 Xamarin. Android 바인딩 프로젝트를 다시 빌드하고 빌드 로그를 검토 하 여 문제의 원인에 대 한 단서를 찾습니다.After enabling the diagnostic output, rebuild the Xamarin.Android binding project and examine the build log to locate clues about what the cause of problem is.

Android 라이브러리를 디컴파일 하 고 Xamarin.ios에서 바인딩하려는 형식 및 메서드를 검사 하는 데에도 도움이 될 수 있습니다.It can also prove helpful to decompile the Android library and examine the types and methods that Xamarin.Android is trying to bind. 이 내용은이 가이드의 뒷부분에서 자세히 설명 합니다.This is covered in more detail later on in this guide.

Android 라이브러리 디컴파일Decompiling an Android Library

Java 클래스의 클래스와 메서드를 검사 하면 라이브러리를 바인딩하는 데 도움이 되는 유용한 정보를 제공할 수 있습니다.Inspecting the classes and methods of the Java classes can provide valuable information that will assist in binding a library. Jd-GUI 는 JAR에 포함 된 클래스 파일의 Java 소스 코드를 표시할 수 있는 그래픽 유틸리티입니다.JD-GUI is a graphical utility that can display Java source code from the CLASS files contained in a JAR. 독립 실행형 응용 프로그램으로 실행 되거나 IntelliJ 또는 Eclipse의 플러그 인으로 실행 될 수 있습니다.It can be run as a stand alone application or as a plug-in for IntelliJ or Eclipse.

Android 라이브러리를 디컴파일 하려면를 엽니다 . Java 디컴파일러를 사용 하는 JAR 파일입니다.To decompile an Android library open the .JAR file with the Java decompiler. 라이브러리가 이면이 고, AAR 파일을 보관 하려면 보관 파일에서 파일 클래스 .jar 를 추출 해야 합니다.If the library is an .AAR file, it is necessary to extract the file classes.jar from the archive file. 다음은 JD-GUI를 사용 하 여 Picasso JAR을 분석 하는 샘플 스크린샷입니다.The following is a sample screenshot of using JD-GUI to analyze the Picasso JAR:

Java 디컴파일러를 사용 하 여 picasso-2.5.2를 분석 합니다.

Android 라이브러리를 디컴파일된 소스 코드를 검사 합니다.Once you have decompiled the Android library, examine the source code. 일반적으로 다음을 찾습니다.Generally speaking, look for :

  • 난독 처리 된 클래스의 특성에 난독 처리 – 특성이 있는 클래스는 다음과 같습니다.Classes that have characteristics of obfuscation – Characteristics of obfuscated classes include:

    • 클래스 이름에는 $ (예: $. 클래스 )가 포함 됩니다.The class name includes a $, i.e. a$.class
    • 클래스 이름은 소문자 (예: 클래스 )로 완전히 손상 됩니다.The class name is entirely compromised of lower case characters, i.e. a.class
  • 참조 되지 않은 라이브러리 – import 문을 참조 하 여 참조 되지 않은 라이브러리를 식별 하 고 ReferenceJar 또는 EmbedddedReferenceJar의 빌드 작업 을 사용 하 여 이러한 종속성을 xamarin.ios 바인딩 프로젝트에 추가 합니다..import statements for unreferenced libraries – Identify the unreferenced library and add those dependencies to the Xamarin.Android binding project with a Build Action of ReferenceJar or EmbedddedReferenceJar.

참고

디컴파일 Java 라이브러리를 사용 하지 않도록 설정 하거나 로컬 법률 또는 Java 라이브러리가 게시 된 라이선스에 따라 법적 제한을 받을 수 있습니다.Decompiling a Java library may be prohibited or subject to legal restrictions based on local laws or the license under which the Java library was published. 필요한 경우 Java 라이브러리를 디컴파일 하 고 소스 코드를 검사 하기 전에 법적 전문가의 서비스를 등록 합니다.If necessary, enlist the services of a legal professional before attempting to decompile a Java library and inspect the source code.

API를 검사 합니다. XMLInspect API.XML

바인딩 프로젝트를 빌드하는 과정에서 Xamarin.ios는 XML 파일 이름 obj/Debug/api-version을 생성 합니다.As a part of building a binding project, Xamarin.Android will generate an XML file name obj/Debug/api.xml:

Obj/Debug 아래에 api .xml을 생성 했습니다.

이 파일은 Xamarin에서 바인딩을 시도 하는 모든 Java Api 목록을 제공 합니다.This file provides a list of all the Java APIs that Xamarin.Android is trying bind. 이 파일의 내용은 누락 된 형식 또는 메서드, 중복 된 바인딩을 식별 하는 데 도움이 될 수 있습니다.The contents of this file can help identify any missing types or methods, duplicate binding. 이 파일을 검사 하는 데 오랜 시간이 걸리고 있지만 바인딩 문제를 일으킬 수 있는 원인을 파악할 수 있습니다.Although inspection of this file is tedious and time consuming, it can provide for clues on what might be causing any binding problems. 예를 들어, api .xml 은 속성이 부적절 한 형식을 반환 하거나 동일한 관리 되는 이름을 공유 하는 두 가지 형식이 있음을 나타낼 수 있습니다.For example, api.xml might reveal that a property is returning an inappropriate type, or that there are two types that share the same managed name.

알려진 문제점Known Issues

이 섹션에서는 Android 라이브러리를 바인딩할 때 발생 하는 몇 가지 일반적인 오류 메시지 또는 증상을 나열 합니다.This section will list some of the common error messages or symptoms that my occur when trying to bind an Android library.

문제: Java 버전이 일치 하지 않습니다.Problem: Java Version Mismatch

라이브러리가 컴파일되는 것과 비교 하 여 최신 또는 이전 버전의 Java를 사용 하는 경우에도 형식이 생성 되지 않거나 예기치 않은 충돌이 발생할 수 있습니다.Sometimes types will not be generated or unexpected crashes may occur because you are using either a newer or older version of Java compared to what the library was compiled with. Xamarin Android 프로젝트에서 사용 하는 것과 동일한 버전의 JDK를 사용 하 여 Android 라이브러리를 다시 컴파일합니다.Recompile the Android library with the same version of the JDK that your Xamarin.Android project is using.

문제: 하나 이상의 Java 라이브러리가 필요 합니다.Problem: At least one Java library is required

그러나 "하나 이상의 Java 라이브러리가 필요 합니다." 라는 오류가 표시 됩니다. JAR을 추가 했습니다.You receive the error "at least one Java library is required," even though a .JAR has been added.

가능한 원인:Possible Causes:

빌드 작업이 EmbeddedJar로 설정 되었는지 확인 합니다.Make sure the build action is set to EmbeddedJar. 에 대 한 여러 빌드 작업이 있기 때문입니다. JAR 파일 (예: InputJar, EmbeddedJar, ReferenceJarEmbeddedReferenceJar)은 바인딩 생성기에서 기본적으로 사용할 항목을 자동으로 추측할 수 없습니다.Since there are multiple build actions for .JAR files (such as InputJar, EmbeddedJar, ReferenceJar and EmbeddedReferenceJar), the binding generator cannot automatically guess which one to use by default. 빌드 작업에 대 한 자세한 내용은 빌드 작업을 참조 하세요.For more information about build actions, see Build Actions.

문제: 바인딩 도구는를 로드할 수 없습니다. JAR 라이브러리Problem: Binding tools cannot load the .JAR library

바인딩 라이브러리 생성기는를 로드 하지 못합니다. JAR 라이브러리.The binding library generator fails to load the .JAR library.

가능한 원인Possible Causes

개. 코드 난독 처리 (Proguard와 같은 도구를 통해)를 사용 하는 JAR 라이브러리는 Java 도구를 사용 하 여 로드할 수 없습니다.Some .JAR libraries that use code obfuscation (via tools such as Proguard) cannot be loaded by the Java tools. 이 도구는 Java 리플렉션 및 ASM 바이트 코드 엔지니어링 라이브러리를 사용 하므로 Android 런타임 도구가 통과할 수 있는 동안 이러한 종속 도구는 난독 처리 된 라이브러리를 거부할 수 있습니다.Since our tool makes use of Java reflection and the ASM byte code engineering library, those dependent tools may reject the obfuscated libraries while Android runtime tools may pass. 이에 대 한 해결 방법은 바인딩 생성기를 사용 하는 대신 이러한 라이브러리를 직접 바인딩하는 것입니다.The workaround for this is to hand-bind these libraries instead of using the binding generator.

문제: 생성 C# 된 출력에 누락 된 형식이 있습니다.Problem: Missing C# types in generated output.

Binding .dll 은 일부 Java 형식을 작성 하지만 누락 된 형식이 있다는 오류 때문 C# 에 생성 된 소스가 빌드되지 않습니다.The binding .dll builds but misses some Java types, or the generated C# source does not build due to an error stating there are missing types.

가능한 원인:Possible Causes:

이 오류는 다음과 같은 몇 가지 이유로 인해 발생할 수 있습니다.This error may occur due to several reasons as listed below:

  • 바인딩되는 라이브러리는 두 번째 Java 라이브러리를 참조할 수 있습니다.The library being bound may reference a second Java library. 바인딩된 라이브러리의 공용 API가 두 번째 라이브러리의 형식을 사용 하는 경우 두 번째 라이브러리에 대 한 관리 되는 바인딩만 참조 해야 합니다.If the public API for the bound library uses types from the second library, you must reference a managed binding for the second library as well.

  • 위의 라이브러리 로드 오류가 발생 하는 이유와 유사 하 게 Java 리플렉션으로 인해 라이브러리가 삽입 되었을 수 있으며,이로 인해 예기치 않은 메타 데이터를 로드할 수 있습니다.It is possible that a library was injected due to Java reflection, similar to the reason for the library load error above, causing the unexpected loading of metadata. Xamarin Android의 도구는 현재이 상황을 해결할 수 없습니다.Xamarin.Android's tooling cannot currently resolve this situation. 이러한 경우 라이브러리는 수동으로 바인딩되어야 합니다.In such a case, the library must be manually bound.

  • .NET 4.0 런타임에 어셈블리를 로드 하지 못한 버그가 있습니다.There was a bug in .NET 4.0 runtime that failed to load assemblies when it should have. 이 문제는 .NET 4.5 런타임에서 해결 되었습니다.This issue has been fixed in the .NET 4.5 runtime.

  • Java는 public 클래스가 아닌 클래스에서 파생 될 수 있지만 .NET에서는 지원 되지 않습니다.Java allows deriving a public class from non-public class, but this is unsupported in .NET. 바인딩 생성기는 public이 아닌 클래스에 대 한 바인딩을 생성 하지 않으므로 이러한 파생 클래스를 올바르게 생성할 수 없습니다.Since the binding generator does not generate bindings for non-public classes, derived classes such as these cannot be generated correctly. 이 문제를 해결 하려면 메타 데이터 .xml의 제거 노드를 사용 하 여 파생 된 클래스에 대 한 메타 데이터 항목을 제거 하거나 public이 아닌 클래스를 public으로 설정 하는 메타 데이터를 수정 합니다.To fix this, either remove the metadata entry for those derived classes using the remove-node in Metadata.xml, or fix the metadata that is making the non-public class public. 후자 솔루션은 C# 소스가 빌드하도록 바인딩을 만들기 때문에 public이 아닌 클래스를 사용 하면 안 됩니다.Although the latter solution will create the binding so that the C# source will build, the non-public class should not be used.

    예를 들면,For example:

    <attr path="/api/package[@name='com.some.package']/class[@name='SomeClass']"
        name="visibility">public</attr>
    
  • Java 라이브러리를 난독 처리 하는 도구는 Xamarin Android 바인딩 생성기 및 래퍼 클래스 생성 C# 기능을 방해할 수 있습니다.Tools that obfuscate Java libraries may interfere with the Xamarin.Android Binding Generator and its ability to generate C# wrapper classes. 다음 코드 조각은 클래스 이름을 unobfuscate 하는 메타 데이터 를 업데이트 하는 방법을 보여 줍니다.The following snippet shows how to update Metadata.xml to unobfuscate a class name:

    <attr path="/api/package[@name='{package_name}']/class[@name='{name}']"
        name="obfuscated">false</attr>
    

문제: 매개 C# 변수 형식이 일치 하지 않아 생성 된 소스가 빌드되지 않습니다.Problem: Generated C# source does not build due to parameter type mismatch

생성 C# 된 소스가 빌드되지 않습니다.The generated C# source does not build. 재정의 된 메서드의 매개 변수 형식이 일치 하지 않습니다.Overridden method's parameter types do not match.

가능한 원인:Possible Causes:

Xamarin.ios에는 C# 바인딩의 열거형에 매핑되는 다양 한 Java 필드가 포함 되어 있습니다.Xamarin.Android includes a variety of Java fields that are mapped to enums in the C# bindings. 이로 인해 생성 된 바인딩에서 형식이 호환 되지 않을 수 있습니다.These can cause type incompatibilities in the generated bindings. 이 문제를 해결 하려면 열거형을 사용 하도록 바인딩 생성기에서 만든 메서드 시그니처를 수정 해야 합니다.To resolve this, the method signatures created from the binding generator need to be modified to use the enums. 자세한 내용은 열거형 수정을 참조 하세요.For more information, please see Correcting Enums.

문제: 포장 NoClassDefFoundErrorProblem: NoClassDefFoundError in packaging

java.lang.NoClassDefFoundError는 패키징 단계에서 throw 됩니다.java.lang.NoClassDefFoundError is thrown in the packaging step.

가능한 원인:Possible Causes:

이 오류가 발생 하는 가장 큰 이유는 필수 Java 라이브러리를 응용 프로그램 프로젝트 ( .csproj)에 추가 해야 하기 때문입니다.The most likely reason for this error is that a mandatory Java library needs to be added to the application project (.csproj). . JAR 파일은 자동으로 확인 되지 않습니다..JAR files are not automatically resolved. 대상 장치 또는 에뮬레이터 (예: Google Maps )에 없는 사용자 어셈블리에 대해 Java 라이브러리 바인딩이 항상 생성 되는 것은 아닙니다.A Java library binding is not always generated against a user assembly that does not exist in the target device or emulator (such as Google Maps maps.jar). 이는 라이브러리로 서 Android 라이브러리 프로젝트를 지원 하지 않는 경우입니다. JAR은 라이브러리 dll에 포함 되어 있습니다.This is not the case for Android Library project support, as the library .JAR is embedded in the library dll. 예: 버그 4288For example: Bug 4288

문제: 사용자 지정 EventArgs 형식이 중복 되었습니다.Problem: Duplicate custom EventArgs types

사용자 지정 EventArgs 형식이 중복 되어 빌드가 실패 합니다.Build fails due to duplicate custom EventArgs types. 다음과 같은 오류가 발생 합니다.An error like this occurs:

error CS0102: The type `Com.Google.Ads.Mediation.DismissScreenEventArgs' already contains a definition for `p0'

가능한 원인:Possible Causes:

이는 동일한 이름을 가진 메서드를 공유 하는 둘 이상의 인터페이스 "listener" 형식에서 제공 하는 이벤트 형식 간에 충돌이 발생 하기 때문입니다.This is because there is some conflict between event types that come from more than one interface "listener" type that shares methods having identical names. 예를 들어 아래 예제에서 볼 수 있는 것 처럼 두 개의 Java 인터페이스가 있는 경우 생성기는 MediationBannerListenerMediationInterstitialListener에 대 한 DismissScreenEventArgs를 생성 하므로 오류가 발생 합니다.For example, if there are two Java interfaces as seen in the example below, the generator creates DismissScreenEventArgs for both MediationBannerListener and MediationInterstitialListener, resulting in the error.

// Java:
public interface MediationBannerListener {
    void onDismissScreen(MediationBannerAdapter p0);
}
public interface MediationInterstitialListener {
    void onDismissScreen(MediationInterstitialAdapter p0);
}

이는 이벤트 인수 형식에 대 한 긴 이름이 회피 되도록 의도적으로 설계 된 것입니다.This is by design so that lengthy names on event argument types are avoided. 이러한 충돌을 방지 하기 위해 일부 메타 데이터 변환이 필요 합니다.To avoid these conflicts, some metadata transformation is required. Transforms\Metadata.xml 를 편집 하 고 인터페이스 (또는 인터페이스 메서드에서) 중 하나에 argsType 특성을 추가 합니다.Edit Transforms\Metadata.xml and add an argsType attribute on either of the interfaces (or on the interface method):

<attr path="/api/package[@name='com.google.ads.mediation']/
        interface[@name='MediationBannerListener']/method[@name='onDismissScreen']"
        name="argsType">BannerDismissScreenEventArgs</attr>

<attr path="/api/package[@name='com.google.ads.mediation']/
        interface[@name='MediationInterstitialListener']/method[@name='onDismissScreen']"
        name="argsType">IntersitionalDismissScreenEventArgs</attr>

<attr path="/api/package[@name='android.content']/
        interface[@name='DialogInterface.OnClickListener']"
        name="argsType">DialogClickEventArgs</attr>

문제: 클래스에서 인터페이스 메서드를 구현 하지 않습니다.Problem: Class does not implement interface method

생성 된 클래스가 구현 된 클래스에서 구현 하는 인터페이스에 필요한 메서드를 구현 하지 않음을 나타내는 오류 메시지가 생성 됩니다.An error message is produced indicating that a generated class does not implement a method that is required for an interface which the generated class implements. 그러나 생성 된 코드를 살펴보면 메서드가 구현 된 것을 볼 수 있습니다.However, looking at the generated code, you can see that the method is implemented.

오류의 예는 다음과 같습니다.Here is an example of the error:

obj\Debug\generated\src\Oauth.Signpost.Basic.HttpURLConnectionRequestAdapter.cs(8,23):
error CS0738: 'Oauth.Signpost.Basic.HttpURLConnectionRequestAdapter' does not
implement interface member 'Oauth.Signpost.Http.IHttpRequest.Unwrap()'.
'Oauth.Signpost.Basic.HttpURLConnectionRequestAdapter.Unwrap()' cannot implement
'Oauth.Signpost.Http.IHttpRequest.Unwrap()' because it does not have the matching
return type of 'Java.Lang.Object'

가능한 원인:Possible Causes:

이는 공변 (covariant) 반환 형식을 사용 하 여 Java 메서드를 바인딩하는 경우 발생 하는 문제입니다.This is a problem that occurs with binding Java methods with covariant return types. 이 예제에서 메서드 Oauth.Signpost.Http.IHttpRequest.UnWrap() Java.Lang.Object를 반환 해야 합니다.In this example, the method Oauth.Signpost.Http.IHttpRequest.UnWrap() needs to return Java.Lang.Object. 그러나 메서드 Oauth.Signpost.Basic.HttpURLConnectionRequestAdapter.UnWrap() HttpURLConnection의 반환 형식이 있습니다.However, the method Oauth.Signpost.Basic.HttpURLConnectionRequestAdapter.UnWrap() has a return type of HttpURLConnection. 이 문제를 해결 하는 방법에는 다음 두 가지가 있습니다.There are two ways to fix this issue:

  • HttpURLConnectionRequestAdapter에 대 한 partial 클래스 선언을 추가 하 고 IHttpRequest.Unwrap()을 명시적으로 구현 합니다.Add a partial class declaration for HttpURLConnectionRequestAdapter and explicitly implement IHttpRequest.Unwrap():

    namespace Oauth.Signpost.Basic {
        partial class HttpURLConnectionRequestAdapter {
            Java.Lang.Object OauthSignpost.Http.IHttpRequest.Unwrap() {
                return Unwrap();
            }
        }
    }
    
  • 생성 C# 된 코드에서 공 분산을 제거 합니다.Remove the covariance from the generated C# code. 여기에는 생성 C# 된 코드에Java.Lang.Object반환 형식이 포함 되도록 다음 변환을 Transforms\Metadata.xml 에 추가 하는 작업이 포함 됩니다.This involves adding the following transform to Transforms\Metadata.xml which will cause the generated C# code to have a return type of Java.Lang.Object:

    <attr
        path="/api/package[@name='oauth.signpost.basic']/class[@name='HttpURLConnectionRequestAdapter']/method[@name='unwrap']"
        name="managedReturn">Java.Lang.Object
    </attr>
    

문제: 내부 클래스/속성에 대 한 이름 충돌Problem: Name Collisions on Inner Classes / Properties

상속 된 개체에 대 한 표시 유형이 충돌 합니다.Conflicting visibility on inherited objects.

Java에서 파생 된 클래스의 표시 유형이 부모와 같을 필요는 없습니다.In Java, it's not required that a derived class have the same visibility as its parent. Java는 사용자를 대신 하 여 수정 합니다.Java will just fix that for you. C#에서는 명시적 이어야 하므로 계층 구조의 모든 클래스에 적절 한 표시 유형이 있는지 확인 해야 합니다.In C#, that has to be explicit, so you need to make sure all classes in the hierarchy have the appropriate visibility. 다음 예제에서는 Java 패키지 이름을 com.evernote.android.job에서 Evernote.AndroidJob로 변경 하는 방법을 보여 줍니다.The following example shows how to change a Java package name from com.evernote.android.job to Evernote.AndroidJob:

<!-- Change the visibility of a class -->
<attr path="/api/package[@name='namespace']/class[@name='ClassName']" name="visibility">public</attr>

<!-- Change the visibility of a method -->
<attr path="/api/package[@name='namespace']/class[@name='ClassName']/method[@name='MethodName']" name="visibility">public</attr>

문제: A . 따라서 바인딩에 필요한 라이브러리가 로드 되 고 있지 않습니다.Problem: A .so Library Required by the Binding is Not Loading

일부 바인딩 프로젝트는의 기능에 종속 될 수도 있습니다.Some binding projects may also depend on functionality in a .so library. Xamarin.ios가 자동으로 라이브러리를 로드 하지 않을 수 있습니다.It is possible that Xamarin.Android will not automatically load the .so 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");

요약Summary

이 문서에서는 Java 바인딩과 관련 된 일반적인 문제 해결 및 해결 방법에 대해 설명 했습니다.In this article, we listed common troubleshooting issues associated with Java Bindings and explained how to resolve them.