/* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #define LOG_TAG "ParcelSurfaceTexture" #include #include #include #include #include #include "android_util_Binder.h" #include "jni.h" #include "JNIHelp.h" // ---------------------------------------------------------------------------- namespace android { const char* const kParcelSurfaceTextureClassPathName = "android/graphics/ParcelSurfaceTexture"; struct fields_t { jfieldID iSurfaceTexture; }; static fields_t fields; #define ANDROID_GRAPHICS_ISURFACETEXTURE_JNI_ID "mISurfaceTexture" // ---------------------------------------------------------------------------- static void ParcelSurfaceTexture_setISurfaceTexture( JNIEnv* env, jobject thiz, const sp& iSurfaceTexture) { ISurfaceTexture* const p = (ISurfaceTexture*)env->GetIntField(thiz, fields.iSurfaceTexture); if (iSurfaceTexture.get()) { iSurfaceTexture->incStrong(thiz); } if (p) { p->decStrong(thiz); } env->SetIntField(thiz, fields.iSurfaceTexture, (int)iSurfaceTexture.get()); } sp ParcelSurfaceTexture_getISurfaceTexture( JNIEnv* env, jobject thiz) { sp iSurfaceTexture( (ISurfaceTexture*)env->GetIntField(thiz, fields.iSurfaceTexture)); return iSurfaceTexture; } sp android_ParcelSurfaceTexture_getNativeWindow( JNIEnv* env, jobject thiz) { sp iSurfaceTexture( ParcelSurfaceTexture_getISurfaceTexture(env, thiz)); sp surfaceTextureClient(iSurfaceTexture != NULL ? new SurfaceTextureClient(iSurfaceTexture) : NULL); return surfaceTextureClient; } bool android_ParcelSurfaceTexture_isInstanceOf(JNIEnv* env, jobject thiz) { jclass parcelSurfaceTextureClass = env->FindClass( kParcelSurfaceTextureClassPathName); return env->IsInstanceOf(thiz, parcelSurfaceTextureClass); } // ---------------------------------------------------------------------------- static void ParcelSurfaceTexture_classInit(JNIEnv* env, jclass clazz) { fields.iSurfaceTexture = env->GetFieldID(clazz, ANDROID_GRAPHICS_ISURFACETEXTURE_JNI_ID, "I"); if (fields.iSurfaceTexture == NULL) { LOGE("can't find android/graphics/ParcelSurfaceTexture.%s", ANDROID_GRAPHICS_ISURFACETEXTURE_JNI_ID); } } static void ParcelSurfaceTexture_init(JNIEnv* env, jobject thiz, jobject jSurfaceTexture) { sp iSurfaceTexture( SurfaceTexture_getSurfaceTexture(env, jSurfaceTexture)); ParcelSurfaceTexture_setISurfaceTexture(env, thiz, iSurfaceTexture); } static void ParcelSurfaceTexture_finalize(JNIEnv* env, jobject thiz) { ParcelSurfaceTexture_setISurfaceTexture(env, thiz, 0); } static void ParcelSurfaceTexture_writeToParcel( JNIEnv* env, jobject thiz, jobject jParcel, jint flags) { Parcel* parcel = parcelForJavaObject(env, jParcel); sp iSurfaceTexture( ParcelSurfaceTexture_getISurfaceTexture(env, thiz)); sp b(iSurfaceTexture->asBinder()); parcel->writeStrongBinder(b); } static void ParcelSurfaceTexture_readFromParcel( JNIEnv* env, jobject thiz, jobject jParcel) { Parcel* parcel = parcelForJavaObject(env, jParcel); sp iSurfaceTexture( interface_cast(parcel->readStrongBinder())); ParcelSurfaceTexture_setISurfaceTexture(env, thiz, iSurfaceTexture); } // ---------------------------------------------------------------------------- static JNINativeMethod gParcelSurfaceTextureMethods[] = { {"nativeClassInit", "()V", (void*)ParcelSurfaceTexture_classInit }, {"nativeInit", "(Landroid/graphics/SurfaceTexture;)V", (void *)ParcelSurfaceTexture_init }, { "nativeFinalize", "()V", (void *)ParcelSurfaceTexture_finalize }, { "nativeWriteToParcel", "(Landroid/os/Parcel;I)V", (void *)ParcelSurfaceTexture_writeToParcel }, { "nativeReadFromParcel", "(Landroid/os/Parcel;)V", (void *)ParcelSurfaceTexture_readFromParcel }, }; int register_android_graphics_ParcelSurfaceTexture(JNIEnv* env) { int err = 0; err = AndroidRuntime::registerNativeMethods(env, kParcelSurfaceTextureClassPathName, gParcelSurfaceTextureMethods, NELEM(gParcelSurfaceTextureMethods)); return err; } } // namespace android