Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

AbstractMethodError: abstract method "android.util.Size androidx.camera.core.ImageAnalysis$Analyzer.getDefaultTargetResolution()" #767

Open
rgroenewoudt opened this issue Jul 28, 2023 · 4 comments
Labels
binding-issue Java error when attempting to use bound type/method

Comments

@rgroenewoudt
Copy link

rgroenewoudt commented Jul 28, 2023

Android application type

Android for .NET (net6.0-android, etc.)

Affected platform version

VS2022 17.6.5

Description

With the latest version of CameraX we are running into an exception when inheriting from ImageAnalysis.IAnalyzer:

JNI DETECTED ERROR IN APPLICATION: JNI CallObjectMethodA called with pending exception java.lang.AbstractMethodError: abstract method "android.util.Size androidx.camera.core.ImageAnalysis$Analyzer.getDefaultTargetResolution()"
at android.util.Size crc64c8b333e758042baf.MainActivity_MyAnalyzer.n_getDefaultTargetResolution() (MainActivity_MyAnalyzer.java:-2)
at android.util.Size crc64c8b333e758042baf.MainActivity_MyAnalyzer.getDefaultTargetResolution() (MainActivity_MyAnalyzer.java:34)
at androidx.camera.core.impl.UseCaseConfig androidx.camera.core.ImageAnalysis.onMergeConfig(androidx.camera.core.impl.CameraInfoInternal, androidx.camera.core.impl.UseCaseConfig$Builder) (ImageAnalysis.java:277)
at androidx.camera.core.impl.UseCaseConfig androidx.camera.core.UseCase.mergeConfigs(androidx.camera.core.impl.CameraInfoInternal, androidx.camera.core.impl.UseCaseConfig, androidx.camera.core.impl.UseCaseConfig) (UseCase.java:277)
at java.util.Map androidx.camera.core.internal.CameraUseCaseAdapter.calculateSuggestedStreamSpecs(int, androidx.camera.core.impl.CameraInfoInternal, java.util.Collection, java.util.Collection, java.util.Map) (CameraUseCaseAdapter.java:682)

We are not calling getDefaultTargetResolution() directly, just passing a ImageAnalysis.IAnalyzer object to the library.

Steps to Reproduce

Minimum reproducible app: AndroidApp7.zip

Tested & affected versions for: Xamarin.AndroidX.Camera.Camera2/Xamarin.AndroidX.Camera.Lifecycle: 1.2.3.1, 1.2.2

Did you find any workaround?

Revert back Xamarin.AndroidX.Camera.* back to 1.2.1

Relevant log output

No response

@pulmuone
Copy link

same issue

@lexboss777
Copy link

Adding DefaultTargetResolution property to the class being passed to SetAnalyzer method seems solving the issue:

imageAnalysis.SetAnalyzer(ContextCompat.GetMainExecutor(Context), this);
...
public Android.Util.Size DefaultTargetResolution => new Android.Util.Size(200, 200);

@pulmuone
Copy link

Adding DefaultTargetResolution property to the class being passed to SetAnalyzer method seems solving the issue:

imageAnalysis.SetAnalyzer(ContextCompat.GetMainExecutor(Context), this); ... public Android.Util.Size DefaultTargetResolution => new Android.Util.Size(200, 200);

Thank you.

@jpobst jpobst added binding-issue Java error when attempting to use bound type/method and removed packages labels Mar 14, 2024
@jpobst
Copy link
Contributor

jpobst commented Mar 15, 2024

Investigation notes (net8.0-android):

getDefaultTargetResolution is a default interface method on the Analyzer interface, it gets bound like this:

[Register("androidx/camera/core/ImageAnalysis$Analyzer", "", "AndroidX.Camera.Core.ImageAnalysis/IAnalyzerInvoker")]
public interface IAnalyzer : IJavaObject, IDisposable, IJavaPeerable {
    unsafe Size? DefaultTargetResolution
    {
        [Register("getDefaultTargetResolution", "()Landroid/util/Size;", "GetGetDefaultTargetResolutionHandler:AndroidX.Camera.Core.ImageAnalysis/IAnalyzer, Xamarin.AndroidX.Camera.Core")]
        get {
            return Java.Lang.Object.GetObject<Size>(_members.InstanceMethods.InvokeVirtualObjectMethod("getDefaultTargetResolution.()Landroid/util/Size;", this, null).Handle, JniHandleOwnership.TransferLocalRef);
        }
    }

    private static Delegate? cb_getDefaultTargetResolution;

    private static Delegate GetGetDefaultTargetResolutionHandler()
    {
        if ((object)cb_getDefaultTargetResolution == null)
        {
            cb_getDefaultTargetResolution = JNINativeWrapper.CreateDelegate(new global::_JniMarshal_PP_L(n_GetDefaultTargetResolution));
        }

        return cb_getDefaultTargetResolution;
    }

    private static nint n_GetDefaultTargetResolution(nint jnienv, nint native__this)
    {
        return JNIEnv.ToLocalJniHandle(Java.Lang.Object.GetObject<IAnalyzer>(jnienv, native__this, JniHandleOwnership.DoNotTransfer).DefaultTargetResolution);
    }
}

This appears to be an issue with Java calling a default interface method where the C# type has not provided a non-default method implementation.

Providing a non-default method implementation in C# fixes the crash.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
binding-issue Java error when attempting to use bound type/method
Projects
None yet
Development

No branches or pull requests

4 participants