سؤال

I'm using the below code to determine whether the user has changed the runtime to ART (which Xamarin currently doesn't support and causes my app to crash).

private bool IsART {
        get {
            try {
                var systemProperties = Java.Lang.Class.ForName("android.os.SystemProperties");

                var strClass = Java.Lang.Class.FromType(typeof (Java.Lang.String));

                Method get = systemProperties.GetMethod("get", strClass, strClass);

                string value = get.Invoke(systemProperties, "persist.sys.dalvik.vm.lib", "Dalvik").ToString();

                if ("libart.so".Equals(value) || "libartd.so".Equals(value)) {
                    return true;
                }
            }
            catch {}

            return false;
        }
    }

Which works fine on my test device (HTC One X) but when run on a Nexus 5 with ART enabled, causes a SIGSEGV error with the following stack trace (which the try-catch doesn't catch):

03-18 19:39:30.045 E/mono-rt (26924):   at <unknown> <0xffffffff>
03-18 19:39:30.045 E/mono-rt (26924):   at (wrapper managed-to-native) object.wrapper_native_0x415b0f9d (intptr,intptr,intptr,Android.Runtime.JValue[]) <0xffffffff>
03-18 19:39:30.045 E/mono-rt (26924):   at (wrapper delegate-invoke) <Module>.invoke_intptr__this___intptr_intptr_intptr_JValue[] (intptr,intptr,intptr,Android.Runtime.JValue[]) <0xffffffff>
03-18 19:39:30.045 E/mono-rt (26924):   at Android.Runtime.JNIEnv.CallStaticObjectMethod (intptr,intptr,Android.Runtime.JValue[]) <0x00097>
03-18 19:39:30.045 E/mono-rt (26924):   at Java.Lang.Class.ForName (string) <0x000ef>
03-18 19:39:30.045 E/mono-rt (26924):   at AwesomeApp.Droid.SplashScreen.get_IsART () <0x0001b>
هل كانت مفيدة؟

المحلول

As of Xamarin.Android 4.12.3, ART is officially supported so the error no longer occurs.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top