Xamarin.forms: Java.Lang.LinkageError: no method with name='getShadowRadius' in android

Created on 14 May 2018  路  10Comments  路  Source: xamarin/Xamarin.Forms

Description

Steps to Reproduce

  1. Debug mode
  2. Install in emulator with android 4.0.3
  3. Launch aplication

Expected Behavior

Actual Behavior

Basic Information

  • Version with issue: Xamarin forms android 3.0.0.446417
  • Last known good version:
  • IDE: Visual Studio For Mac
  • Platform Target Frameworks:

    • iOS:

    • Android: 8.0

    • UWP:

  • Android Support Library Version:
  • Nuget Packages:
  • Affected Devices: Android 4.0.3

Screenshots

Reproduction Link

Crash log:

ExceptionDispatchInfo.Throw ()
Java.Lang.LinkageError: no method with name='getShadowRadius' signature='()F' in class Landroid/widget/TextView;
ExceptionDispatchInfo.Throw ()
JniEnvironment+InstanceMethods.GetMethodID (Java.Interop.JniObjectReference type, System.String name, System.String signature)
JniType.GetInstanceMethod (System.String name, System.String signature)
JniPeerMembers+JniInstanceMethods.GetMethodInfo (System.String encodedMember)
JniPeerMembers+JniInstanceMethods.InvokeVirtualSingleMethod (System.String encodedMember, Java.Interop.IJavaPeerable self, Java.Interop.JniArgumentValue* parameters)
TextView.get_ShadowRadius ()
ButtonBackgroundTracker.UpdateDrawable ()
ButtonBackgroundTracker.UpdateBackgroundColor ()
ButtonRenderer.UpdateBackgroundColor ()
ButtonRenderer.UpdateAll ()
ButtonRenderer.OnElementChanged (Xamarin.Forms.Platform.Android.ElementChangedEventArgs1[TElement] e) VisualElementRenderer1[TElement].SetElement (TElement element)
IVisualElementRenderer.SetElement (Xamarin.Forms.VisualElement element)
Platform.CreateRenderer (Xamarin.Forms.VisualElement element, Android.Content.Context context)
VisualElementPackager.AddChild (Xamarin.Forms.VisualElement view, Xamarin.Forms.Platform.Android.IVisualElementRenderer oldRenderer, Xamarin.Forms.Platform.Android.RendererPool pool, System.Boolean sameChildren)
VisualElementPackager.SetElement (Xamarin.Forms.VisualElement oldElement, Xamarin.Forms.VisualElement newElement)
VisualElementPackager.Load ()
VisualElementRenderer1[TElement].SetPackager (Xamarin.Forms.Platform.Android.VisualElementPackager packager) VisualElementRenderer1[TElement].SetElement (TElement element)
IVisualElementRenderer.SetElement (Xamarin.Forms.VisualElement element)
Platform.CreateRenderer (Xamarin.Forms.VisualElement element, Android.Content.Context context)
VisualElementPackager.AddChild (Xamarin.Forms.VisualElement view, Xamarin.Forms.Platform.Android.IVisualElementRenderer oldRenderer, Xamarin.Forms.Platform.Android.RendererPool pool, System.Boolean sameChildren)
VisualElementPackager.SetElement (Xamarin.Forms.VisualElement oldElement, Xamarin.Forms.VisualElement newElement)
VisualElementPackager.Load ()
VisualElementRenderer1[TElement].SetPackager (Xamarin.Forms.Platform.Android.VisualElementPackager packager) VisualElementRenderer1[TElement].SetElement (TElement element)
IVisualElementRenderer.SetElement (Xamarin.Forms.VisualElement element)
Platform.CreateRenderer (Xamarin.Forms.VisualElement element, Android.Content.Context context)
ScrollViewContainer.set_ChildView (Xamarin.Forms.View value)
ScrollViewRenderer.LoadContent ()
ScrollViewRenderer.SetElement (Xamarin.Forms.VisualElement element)
Platform.CreateRenderer (Xamarin.Forms.VisualElement element, Android.Content.Context context)
VisualElementPackager.AddChild (Xamarin.Forms.VisualElement view, Xamarin.Forms.Platform.Android.IVisualElementRenderer oldRenderer, Xamarin.Forms.Platform.Android.RendererPool pool, System.Boolean sameChildren)
VisualElementPackager.SetElement (Xamarin.Forms.VisualElement oldElement, Xamarin.Forms.VisualElement newElement)
VisualElementPackager.Load ()
VisualElementRenderer1[TElement].SetPackager (Xamarin.Forms.Platform.Android.VisualElementPackager packager) VisualElementRenderer1[TElement].SetElement (TElement element)
IVisualElementRenderer.SetElement (Xamarin.Forms.VisualElement element)
Platform.CreateRenderer (Xamarin.Forms.VisualElement element, Android.Support.V4.App.FragmentManager fragmentManager, Android.Content.Context context)
FragmentContainer.OnCreateView (Android.Views.LayoutInflater inflater, Android.Views.ViewGroup container, Android.OS.Bundle savedInstanceState)
Fragment.n_OnCreateView_Landroid_view_LayoutInflater_Landroid_view_ViewGroup_Landroid_os_Bundle_ (System.IntPtr jnienv, System.IntPtr native__this, System.IntPtr native_inflater, System.IntPtr native_container, System.IntPtr native_savedInstanceState)
(wrapper dynamic-method) System.Object.1bc33cbe-98eb-4de2-80ed-a594e8fd46a0(intptr,intptr,intptr,intptr,intptr)
java.lang.NoSuchMethodError: no method with name='getShadowRadius' signature='()F' in class Landroid/widget/TextView;
md58432a647068b097f9637064b8985a5e0.FragmentContainer.n_onCreateView(Native Method)
md58432a647068b097f9637064b8985a5e0.FragmentContainer.onCreateView(FragmentContainer.java:33)
android.support.v4.app.Fragment.performCreateView(Fragment.java:2261)
android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1419)
android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1750)
android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1819)
android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:797)
android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2590)
android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2377)
android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2332)
android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2239)
android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:700)
android.os.Handler.handleCallback(Handler.java:608)
android.os.Handler.dispatchMessage(Handler.java:92)
android.os.Looper.loop(Looper.java:156)
android.app.ActivityThread.main(ActivityThread.java:4987)
java.lang.reflect.Method.invokeNative(Native Method)
java.lang.reflect.Method.invoke(Method.java:511)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
dalvik.system.NativeStart.main(Native Method)

1 high regression low impact Android bug

All 10 comments

I'm having a little difficulty getting a debugger running on a 4.0.3 emulator but I can get the deployed app to crash (presumably from this issue), so this will need some more investigation.

Related forum report here

Hi guys, do someone from you fixed the issue? any news? without increasing min version...

After looking at the Android docs for the TextView.getShadowRadius method I can see that this was only added in API level 16 Jelly Bean (4.1.x) which would explain why the call fails in 4.0.3 and 4.0.4.

@INHack20 @JTOne123 Why do you care about Android 4.0.x?
According to Google's own stats, Android 4.0.x has about 0.4% presence!
Android 4.0 and 4.0.3 was released by Google in 2011! It makes no sense to support such an old platform.

This page https://github.com/xamarin/Xamarin.Forms does not clearly state which versions of Android and iOS are supported by Xamarin Forms.

I see now that according to documentation https://docs.microsoft.com/en-us/xamarin/xamarin-forms/get-started/installation Android 4.0.3 is supposed to be supported.
It makes sense to support Android 4.4 and up.

Our app has worked happily on Android 4.0.4 for years. We have some users running the app on Nook tablets, which use a customised version of 4.0.4 with no opportunity to update. The Xamarin.Forms documentation says that the target platform is Android 4.0.3 (API 15) or higher. But with the latest version these users are getting the "no method with name='getShadowRadius'" crash. We need a fix to this problem asap.

The only use for the ShadowRadius property on Android is this https://github.com/xamarin/Xamarin.Forms/blob/884035ce8f8f6caa16355e6afee509862d7ce4e1/Xamarin.Forms.Platform.Android/ButtonBackgroundTracker.cs#L80
May be wrap it with Build Sdk check and set it to 0 if it is lower than API 16?

The workaround here worked for me. https://forums.xamarin.com/discussion/126071/unhandled-exception-java-lang-nosuchmethoderror-no-method-with-name-getshadowradius-signature?

I know this only fails on 4.0.4 and is kind of old but I wish Xamarin didn't break the platform they claim to support.

Similar to the _ShadowRadius_ property there's a _LineSpacingMultiplier_ property in what seems to me any Label->TextView and crashes the app on 4.0.3 (probably similarly every API < 16)...since at some point Xamarin.Forms 3+ dropped support for ver<4.4 (even though it seems like yesterday that I saw 4.0.3 somewhere so it might have been even after 3.0?), could you give us a maintenance build of 2.5 that will have this fix please (or whichever was the highest version that didn't have the ShadowRadius problem - think it was 2.5 when I tested it, but unfortunately didn't do a full list of 3.x to make sure some of them didn't have it)?
TIA

P.S.
As far as I can tell _LineSpacingMultiplier_ is only present in the Label renders, and as someone here suggested I could add a Build Sdk check to skip it if it is done on API lower than 19/4.4, but I'm not sure if this was the fix you applied for _ShadowRadius_ actually (if it was just tell me and I'll do a PR with it so it can be 'fixed' in 3.3+)?

Was this page helpful?
0 / 5 - 0 ratings