static jlong nativeReadFromParcel(JNIEnv* env, jclass clazz, jlong nativeObject, jobject parcelObj) { Parcel* parcel = parcelForJavaObject(env, parcelObj); if (parcel == NULL) { doThrowNPE(env); return 0; } sp<Surface> self(reinterpret_cast<Surface *>(nativeObject)); sp<IBinder> binder(parcel->readStrongBinder()); // update the Surface only if the underlying IGraphicBufferProducer // has changed. if (self != NULL && (self->getIGraphicBufferProducer()->asBinder() == binder)) { // same IGraphicBufferProducer, return ourselves return jlong(self.get()); } sp<Surface> sur; sp<IGraphicBufferProducer> gbp(interface_cast<IGraphicBufferProducer>(binder)); if (gbp != NULL) { // we have a new IGraphicBufferProducer, create a new Surface for it sur = new Surface(gbp, true); // and keep a reference before passing to java sur->incStrong(&sRefBaseOwner); } if (self != NULL) { // and loose the java reference to ourselves self->decStrong(&sRefBaseOwner); } return jlong(sur.get()); }
static void Surface_writeToParcel( JNIEnv* env, jobject clazz, jobject argParcel, jint flags) { Parcel* parcel = (Parcel*)env->GetIntField( argParcel, no.native_parcel); if (parcel == NULL) { doThrowNPE(env); return; } // The Java instance may have a SurfaceControl (in the case of the // WindowManager or a system app). In that case, we defer to the // SurfaceControl to send its ISurface. Otherwise, if the Surface is // available we let it parcel itself. Finally, if the Surface is also // NULL we fall back to using the SurfaceControl path which sends an // empty surface; this matches legacy behavior. const sp<SurfaceControl>& control(getSurfaceControl(env, clazz)); if (control != NULL) { SurfaceControl::writeSurfaceToParcel(control, parcel); } else { sp<Surface> surface(Surface_getSurface(env, clazz)); if (surface != NULL) { Surface::writeToParcel(surface, parcel); } else { SurfaceControl::writeSurfaceToParcel(NULL, parcel); } } if (flags & PARCELABLE_WRITE_RETURN_VALUE) { setSurfaceControl(env, clazz, NULL); setSurface(env, clazz, NULL); } }
static void Surface_copyFrom( JNIEnv* env, jobject clazz, jobject other) { if (clazz == other) return; if (other == NULL) { doThrowNPE(env); return; } /* * This is used by the WindowManagerService just after constructing * a Surface and is necessary for returning the Surface reference to * the caller. At this point, we should only have a SurfaceControl. */ const sp<SurfaceControl>& surface = getSurfaceControl(env, clazz); const sp<SurfaceControl>& rhs = getSurfaceControl(env, other); if (!SurfaceControl::isSameSurface(surface, rhs)) { // we reassign the surface only if it's a different one // otherwise we would loose our client-side state. setSurfaceControl(env, clazz, rhs); } }
static void Surface_init( JNIEnv* env, jobject clazz, jobject session, jint, jstring jname, jint dpy, jint w, jint h, jint format, jint flags) { if (session == NULL) { doThrowNPE(env); return; } SurfaceComposerClient* client = (SurfaceComposerClient*)env->GetIntField(session, sso.client); sp<SurfaceControl> surface; if (jname == NULL) { surface = client->createSurface(dpy, w, h, format, flags); } else { const jchar* str = env->GetStringCritical(jname, 0); const String8 name((const char16_t*)str, env->GetStringLength(jname)); env->ReleaseStringCritical(jname, str); surface = client->createSurface(name, dpy, w, h, format, flags); } if (surface == 0) { jniThrowException(env, OutOfResourcesException, NULL); return; } setSurfaceControl(env, clazz, surface); }
static void nativeWriteToParcel(JNIEnv* env, jclass clazz, jlong nativeObject, jobject parcelObj) { Parcel* parcel = parcelForJavaObject(env, parcelObj); if (parcel == NULL) { doThrowNPE(env); return; } sp<Surface> self(reinterpret_cast<Surface *>(nativeObject)); parcel->writeStrongBinder( self != 0 ? self->getIGraphicBufferProducer()->asBinder() : NULL); }
static void Surface_initParcel(JNIEnv* env, jobject clazz, jobject argParcel) { Parcel* parcel = (Parcel*)env->GetIntField(argParcel, no.native_parcel); if (parcel == NULL) { doThrowNPE(env); return; } sp<Surface> sur(Surface::readFromParcel(*parcel)); setSurface(env, clazz, sur); }
static void Surface_transferFrom( JNIEnv* env, jobject clazz, jobject other) { if (clazz == other) return; if (other == NULL) { doThrowNPE(env); return; } sp<SurfaceControl> control(getSurfaceControl(env, other)); sp<Surface> surface(Surface_getSurface(env, other)); setSurfaceControl(env, clazz, control); setSurface(env, clazz, surface); setSurfaceControl(env, other, 0); setSurface(env, other, 0); }