• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package org.robolectric.shadows;
2 
3 import static android.os.Build.VERSION_CODES.LOLLIPOP;
4 
5 import android.annotation.TargetApi;
6 import dalvik.system.VMRuntime;
7 import java.lang.reflect.Array;
8 import javax.annotation.Nullable;
9 import org.robolectric.annotation.Implementation;
10 import org.robolectric.annotation.Implements;
11 import org.robolectric.annotation.Resetter;
12 import org.robolectric.res.android.NativeObjRegistry;
13 
14 @Implements(value = VMRuntime.class, isInAndroidSdk = false)
15 public class ShadowVMRuntime {
16 
17   private final NativeObjRegistry<Object> nativeObjRegistry =
18       new NativeObjRegistry<>("VRRuntime.nativeObjectRegistry");
19   // There actually isn't any android JNI code to call through to in Robolectric due to
20   // cross-platform compatibility issues. We default to a reasonable value that reflects the devices
21   // that would commonly run this code.
22   private static boolean is64Bit = true;
23 
24   @Implementation(minSdk = LOLLIPOP)
newUnpaddedArray(Class<?> klass, int size)25   public Object newUnpaddedArray(Class<?> klass, int size) {
26     return Array.newInstance(klass, size);
27   }
28 
29   @Implementation
newNonMovableArray(Class<?> type, int size)30   public Object newNonMovableArray(Class<?> type, int size) {
31     if (type.equals(int.class)) {
32       return new int[size];
33     }
34     return null;
35   }
36 
37   /**
38    * Returns a unique identifier of the object instead of a 'native' address.
39    */
40   @Implementation
addressOf(Object obj)41   public long addressOf(Object obj) {
42     return nativeObjRegistry.register(obj);
43   }
44 
45   /**
46    * Returns the object previously registered with {@link #addressOf(Object)}.
47    */
48   public @Nullable
getObjectForAddress(long address)49   Object getObjectForAddress(long address) {
50     return nativeObjRegistry.getNativeObject(address);
51   }
52 
53   /**
54    * Returns whether the VM is running in 64-bit mode. Available in Android L+. Defaults to true.
55    */
56   @Implementation(minSdk = LOLLIPOP)
is64Bit()57   protected boolean is64Bit() {
58     return ShadowVMRuntime.is64Bit;
59   }
60 
61   /** Sets whether the VM is running in 64-bit mode. */
62   @TargetApi(LOLLIPOP)
setIs64Bit(boolean is64Bit)63   public static void setIs64Bit(boolean is64Bit) {
64     ShadowVMRuntime.is64Bit = is64Bit;
65   }
66 
67   @Resetter
reset()68   public static void reset() {
69     ShadowVMRuntime.is64Bit = true;
70   }
71 }
72