/*<ptr>*/public static class NSInputStreamPtr extends Ptr<NSInputStream, NSInputStreamPtr> {}/*</ptr>*/ /*<bind>*/static { ObjCRuntime.bind(NSInputStream.class); }/*</bind>*/
@SuppressWarnings("unchecked") private static ObjCClass register(Class<? extends ObjCObject> type, String name) { ObjCClass superclass = getByType((Class<? extends ObjCObject>) type.getSuperclass()); long handle = ObjCRuntime.objc_allocateClassPair(superclass.getHandle(), VM.getStringUTFChars(name), 0); if (handle == 0L) { throw new ObjCClassNotFoundException("Failed to create custom Objective-C class for Java class: " + type); } else { long methodPtr = isClassMethod ? ObjCRuntime.class_getClassMethod(superclass.getHandle(), selector.getHandle()) : ObjCRuntime.class_getInstanceMethod(superclass.getHandle(), selector.getHandle()); if (methodPtr != 0L) { long encodingPtr = ObjCRuntime.method_getTypeEncoding(methodPtr); if (encodingPtr != 0L) { encoding = VM.newStringUTF(encodingPtr); long ownerHandle = isClassMethod ? ObjCRuntime.object_getClass(handle) : handle; if (!ObjCRuntime.class_addMethod(ownerHandle, selector.getHandle(), impl, encoding != null ? VM.getStringUTFChars(encoding) : 0L)) { throw new ObjCClassNotFoundException("Failed to add method " + selName + " to custom Objective-C class for Java class: " + type); ObjCRuntime.objc_registerClassPair(handle); return new ObjCClass(handle, type, name, !isObjCProxy(type), false);
private static void enableListener(long handle) { long releaseListener = ObjCRuntime.objc_getAssociatedObject(handle, RELEASE_LISTENER_CLASS); if (releaseListener == 0) { releaseListener = ObjCRuntime.ptr_objc_msgSend(RELEASE_LISTENER_CLASS, alloc.getHandle()); if (releaseListener == 0L) { throw new OutOfMemoryError(); } releaseListener = ObjCRuntime.ptr_objc_msgSend(releaseListener, init.getHandle()); VM.setPointer(releaseListener + OWNER_IVAR_OFFSET, handle); ObjCRuntime.objc_setAssociatedObject(handle, RELEASE_LISTENER_CLASS, releaseListener, OBJC_ASSOCIATION_RETAIN_NONATOMIC); ObjCRuntime.void_objc_msgSend(releaseListener, release.getHandle()); } }
public static void registerSubclass(Class<? extends PFObject> subclass) { if (subclass == null) { throw new NullPointerException("subclass"); } if (!subclass.isAnnotationPresent(ParseClassName.class)) { throw new UnsupportedOperationException("Class is missing required @ParseClassName annotation: " + subclass.getSimpleName()); } long cls = ObjCClass.getByType(subclass).getHandle(); ObjCRuntime.class_addProtocol(cls, ObjCRuntime.objc_getProtocol(name_PFSubclassing)); long method = VM.getCallbackMethodImpl(cbParseClassName); ObjCRuntime.class_addMethod(ObjCRuntime.object_getClass(cls), sel_parseClassName, method, typeEncodings_parseClassName); ObjCRuntime.void_objc_msgSend(cls, sel_registerSubclass); }
private static void registerCallbackMethod(long cls, long selector, long newSelector, Method method) { long superMethod = ObjCRuntime.class_getInstanceMethod(cls, selector); long typeEncoding = ObjCRuntime.method_getTypeEncoding(superMethod); if (!ObjCRuntime.class_addMethod(cls, selector, VM.getCallbackMethodImpl(method), typeEncoding)) { throw new Error( "Failed to register callback method on the ObjectOwnershipHelper: class_addMethod(...) failed"); } // find the super class that is a native class and cache it long superClass = ObjCRuntime.class_getSuperclass(cls); long nativeSuper = 0; while (superClass != 0) { ObjCClass objCClass = ObjCClass.toObjCClass(superClass); if (!objCClass.isCustom()) { nativeSuper = superClass; break; } superClass = ObjCRuntime.class_getSuperclass(superClass); } if (nativeSuper == 0) { throw new Error("Couldn't find native super class for " + VM.newStringUTF(ObjCRuntime.class_getName(cls))); } synchronized (customClassToNativeSuper) { customClassToNativeSuper.put(cls, nativeSuper); } }
protected static void retain(long handle) { ObjCRuntime.void_objc_msgSend(handle, retain.getHandle()); }
static long alloc(ObjCClass c) { long h = ObjCRuntime.ptr_objc_msgSend(c.getHandle(), alloc.getHandle()); if (h == 0L) { throw new OutOfMemoryError(); } return h; }
private void updateMenu(NSArray<UIMenuItem> items) { long imp = VM.getCallbackMethodImpl(cbForwarder); long typeEncodings = VM.getStringUTFChars("v@:@"); for (UIMenuItem item : items) { Selector sel = item.getAction(); ObjCRuntime.class_addMethod(UI_MENU_CONTROLLER, sel.getHandle(), imp, typeEncodings); } } /*<methods>*/
@Callback private static void release(@Pointer long self, @Pointer long sel) { int count = ObjCRuntime.int_objc_msgSend(self, retainCount); if (count <= 2) { synchronized (CUSTOM_OBJECTS) { CUSTOM_OBJECTS.remove(self); } } long cls = ObjCRuntime.object_getClass(self); if (logRetainRelease) { logRetainRelease(cls, self, count, false); } Super sup = new Super(self, getNativeSuper(cls)); ObjCRuntime.void_objc_msgSendSuper(sup.getHandle(), sel); }
@Callback private static @Pointer long retain(@Pointer long self, @Pointer long sel) { int count = ObjCRuntime.int_objc_msgSend(self, retainCount); if (count <= 1) { synchronized (CUSTOM_OBJECTS) { ObjCClass cls = ObjCClass.toObjCClass(ObjCRuntime.object_getClass(self)); ObjCObject obj = ObjCObject.toObjCObject(cls.getType(), self, 0); CUSTOM_OBJECTS.put(self, obj); } } long cls = ObjCRuntime.object_getClass(self); if (logRetainRelease) { logRetainRelease(cls, self, count, true); } Super sup = new Super(self, getNativeSuper(cls)); return ObjCRuntime.ptr_objc_msgSendSuper(sup.getHandle(), sel); }
name = nativeClassAnno.value(); name = "".equals(name) ? type.getSimpleName() : name; long classPtr = ObjCRuntime.objc_getClass(VM.getStringUTFChars(name)); if (classPtr != 0L) { c = new ObjCClass(classPtr, type, name, false, false); name = nativeProtocolProxyAnno.value(); name = "".equals(name) ? type.getSimpleName() : name; long protocolPtr = ObjCRuntime.objc_getProtocol(VM.getStringUTFChars(name)); if (protocolPtr != 0L) { c = new ObjCClass(protocolPtr, type, name, false, true);
public static ObjCClass getFromObject(long handle) { long classPtr = ObjCRuntime.object_getClass(handle); return toObjCClass(classPtr); }
@Callback private static void dealloc(@Pointer long self, @Pointer long sel) { // during dealloc UIView calls removeFromSuperView or other api which will cause // retain to be called due ARC or other logic, which will break java CUSTOM_OBJECTS // mechanism. So let it to deallow with extra retains long cls = ObjCRuntime.object_getClass(self); Super sup = new Super(self, getNativeSuper(cls)); ObjCRuntime.void_objc_msgSendSuper(sup.getHandle(), sel); // and after this remove this peer (as it could be added again due unexpected retain calls) synchronized (CUSTOM_OBJECTS) { CUSTOM_OBJECTS.remove(self); } }
private static void enableListener(long handle) { long releaseListener = ObjCRuntime.objc_getAssociatedObject(handle, RELEASE_LISTENER_CLASS); if (releaseListener == 0) { releaseListener = ObjCRuntime.ptr_objc_msgSend(RELEASE_LISTENER_CLASS, alloc.getHandle()); if (releaseListener == 0L) { throw new OutOfMemoryError(); } releaseListener = ObjCRuntime.ptr_objc_msgSend(releaseListener, init.getHandle()); VM.setPointer(releaseListener + OWNER_IVAR_OFFSET, handle); ObjCRuntime.objc_setAssociatedObject(handle, RELEASE_LISTENER_CLASS, releaseListener, OBJC_ASSOCIATION_RETAIN_NONATOMIC); ObjCRuntime.void_objc_msgSend(releaseListener, release.getHandle()); } }
protected static void release(long handle) { ObjCRuntime.void_objc_msgSend(handle, release.getHandle()); }
protected static String domain(long handle) { long h = ObjCRuntime.ptr_objc_msgSend(handle, domain.getHandle()); NSString s = ObjCObject.toObjCObject(NSString.class, h, 0); return s.toString(); }
private void updateMenu(NSArray<UIMenuItem> items) { long imp = VM.getCallbackMethodImpl(cbForwarder); long typeEncodings = VM.getStringUTFChars("v@:@"); for (UIMenuItem item : items) { Selector sel = item.getAction(); ObjCRuntime.class_addMethod(UI_MENU_CONTROLLER, sel.getHandle(), imp, typeEncodings); } } /*<methods>*/
@Callback static void release(@Pointer long self, @Pointer long sel) { int count = ObjCRuntime.int_objc_msgSend(self, retainCount.getHandle()); if (count == 1) { long owner = VM.getPointer(self + OWNER_IVAR_OFFSET); synchronized (ASSOCIATED_OBJECTS) { ASSOCIATED_OBJECTS.remove(owner); } } if(logRetainRelease) { long cls = ObjCRuntime.object_getClass(self); logRetainRelease(cls, self, count, false); } ObjCRuntime.void_objc_msgSendSuper(new Super(self, NS_OBJECT_CLASS).getHandle(), sel); } }
@Callback private static @Pointer long retain(@Pointer long self, @Pointer long sel) { // retain objectm even if retain was called inside of dealloc retainObject(self); int count = ObjCRuntime.int_objc_msgSend(self, retainCount); long cls = ObjCRuntime.object_getClass(self); if (logRetainRelease) { logRetainRelease(cls, self, count, true); } Super sup = new Super(self, getNativeSuper(cls)); return ObjCRuntime.ptr_objc_msgSendSuper(sup.getHandle(), sel); }
public static ObjCClass getFromObject(ObjCObject id) { long handle = id.getHandle(); ObjCClass c = null; if (handle != 0L) { long classPtr = ObjCRuntime.object_getClass(handle); c = ObjCObject.getPeerObject(classPtr); } if (c != null) { return c; } return getByType(id.getClass()); }