
org.robolectric.shadows.ShadowVirtualRefBasePtr Maven / Gradle / Ivy
package org.robolectric.shadows;
import static android.os.Build.VERSION_CODES.LOLLIPOP;
import com.android.internal.util.VirtualRefBasePtr;
import java.util.HashMap;
import java.util.Map;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
@Implements(value = VirtualRefBasePtr.class, isInAndroidSdk = false)
public class ShadowVirtualRefBasePtr {
private static final Map POINTERS = new HashMap<>();
private static long nextNativeObj = 10000;
synchronized public static long put(T object) {
long nativePtr = nextNativeObj++;
POINTERS.put(nativePtr, new RefHolder(object));
return nativePtr;
}
synchronized public static T get(long nativePtr, Class clazz) {
return clazz.cast(POINTERS.get(nativePtr).nativeThing);
}
@Implementation(minSdk = LOLLIPOP)
synchronized public static void nIncStrong(long ptr) {
if (ptr == 0) return;
POINTERS.get(ptr).incr();
}
@Implementation(minSdk = LOLLIPOP)
synchronized public static void nDecStrong(long ptr) {
if (ptr == 0) return;
if (POINTERS.get(ptr).decr()) {
POINTERS.remove(ptr);
}
}
private static class RefHolder {
T nativeThing;
int refCount;
public RefHolder(T object) {
this.nativeThing = object;
}
synchronized public void incr() {
refCount++;
}
synchronized public boolean decr() {
refCount--;
return refCount == 0;
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy