android_util_Binder.cpp revision bd8b6f25bb48daea4aeb0c7463661c8e69baece0
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_TAG "JavaBinder" 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//#define LOG_NDEBUG 0 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "android_util_Binder.h" 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "JNIHelp.h" 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <fcntl.h> 24ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick#include <stdio.h> 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/stat.h> 262c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick#include <sys/types.h> 278f26b323d8f78c6a183e74c464864ef7da457267Brad Fitzpatrick#include <unistd.h> 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Atomic.h> 300795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/IInterface.h> 310795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/IPCThreadState.h> 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Log.h> 332c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick#include <utils/SystemClock.h> 340b41448506610f73302cc631677823fd8b865ea5Christopher Tate#include <utils/List.h> 350b41448506610f73302cc631677823fd8b865ea5Christopher Tate#include <utils/KeyedVector.h> 362c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick#include <cutils/logger.h> 370795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/Parcel.h> 380795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/ProcessState.h> 390795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/IServiceManager.h> 405348c014129b766d621ef82a6e42007009ffc310Brad Fitzpatrick#include <utils/threads.h> 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <android_runtime/AndroidRuntime.h> 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//#undef LOGV 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//#define LOGV(...) fprintf(stderr, __VA_ARGS__) 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectusing namespace android; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct bindernative_offsets_t 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Class state. 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass mClass; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jmethodID mExecTransact; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Object state. 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID mObject; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} gBinderOffsets; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct binderinternal_offsets_t 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Class state. 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass mClass; 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jmethodID mForceGc; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} gBinderInternalOffsets; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct debug_offsets_t 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Class state. 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass mClass; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} gDebugOffsets; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct weakreference_offsets_t 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Class state. 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass mClass; 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jmethodID mGet; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} gWeakReferenceOffsets; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct error_offsets_t 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass mClass; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} gErrorOffsets; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct binderproxy_offsets_t 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Class state. 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass mClass; 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jmethodID mConstructor; 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jmethodID mSendDeathNotice; 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Object state. 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID mObject; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID mSelf; 108bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate jfieldID mOrgue; 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} gBinderProxyOffsets; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct parcel_offsets_t 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID mObject; 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID mOwnObject; 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} gParcelOffsets; 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct log_offsets_t 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Class state. 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass mClass; 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jmethodID mLogE; 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} gLogOffsets; 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct file_descriptor_offsets_t 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass mClass; 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jmethodID mConstructor; 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID mDescriptor; 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} gFileDescriptorOffsets; 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct parcel_file_descriptor_offsets_t 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass mClass; 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jmethodID mConstructor; 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} gParcelFileDescriptorOffsets; 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 140727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrickstatic struct strict_mode_callback_offsets_t 141727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick{ 142727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick jclass mClass; 143727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick jmethodID mCallback; 144727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick} gStrictModeCallbackOffsets; 145727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic volatile int32_t gNumRefsCreated = 0; 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic volatile int32_t gNumProxyRefs = 0; 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic volatile int32_t gNumLocalRefs = 0; 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic volatile int32_t gNumDeathRefs = 0; 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void incRefsCreated(JNIEnv* env) 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int old = android_atomic_inc(&gNumRefsCreated); 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (old == 200) { 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android_atomic_and(0, &gNumRefsCreated); 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->CallStaticVoidMethod(gBinderInternalOffsets.mClass, 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderInternalOffsets.mForceGc); 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("Now have %d binder ops", old); 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JavaVM* jnienv_to_javavm(JNIEnv* env) 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JavaVM* vm; 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return env->GetJavaVM(&vm) >= 0 ? vm : NULL; 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNIEnv* javavm_to_jnienv(JavaVM* vm) 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv* env; 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return vm->GetEnv((void **)&env, JNI_VERSION_1_4) >= 0 ? env : NULL; 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void report_exception(JNIEnv* env, jthrowable excep, const char* msg) 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ExceptionClear(); 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jstring tagstr = env->NewStringUTF(LOG_TAG); 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jstring msgstr = env->NewStringUTF(msg); 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((tagstr == NULL) || (msgstr == NULL)) { 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ExceptionClear(); /* assume exception (OOM?) was thrown */ 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("Unable to call Log.e()\n"); 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("%s", msg); 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->CallStaticIntMethod( 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gLogOffsets.mClass, gLogOffsets.mLogE, tagstr, msgstr, excep); 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (env->ExceptionCheck()) { 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* attempting to log the failure has failed */ 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGW("Failed trying to log exception, msg='%s'\n", msg); 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ExceptionClear(); 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (env->IsInstanceOf(excep, gErrorOffsets.mClass)) { 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * It's an Error: Reraise the exception, detach this thread, and 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * wait for the fireworks. Die even more blatantly after a minute 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if the gentler attempt doesn't do the trick. 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The GetJavaVM function isn't on the "approved" list of JNI calls 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that can be made while an exception is pending, so we want to 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * get the VM ptr, throw the exception, and then detach the thread. 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JavaVM* vm = jnienv_to_javavm(env); 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->Throw(excep); 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project vm->DetachCurrentThread(); 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sleep(60); 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("Forcefully exiting"); 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project exit(1); 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *((int *) 1) = 1; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbail: 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* discard local refs created for us by VM */ 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->DeleteLocalRef(tagstr); 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->DeleteLocalRef(msgstr); 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 226727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrickstatic void set_dalvik_blockguard_policy(JNIEnv* env, jint strict_policy) 227727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick{ 228727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick // Call back into android.os.StrictMode#onBinderStrictModePolicyChange 229727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick // to sync our state back to it. See the comments in StrictMode.java. 230727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick env->CallStaticVoidMethod(gStrictModeCallbackOffsets.mClass, 231727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick gStrictModeCallbackOffsets.mCallback, 232727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick strict_policy); 233727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick} 234727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass JavaBBinderHolder; 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass JavaBBinder : public BBinder 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JavaBBinder(JNIEnv* env, jobject object) 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : mVM(jnienv_to_javavm(env)), mObject(env->NewGlobalRef(object)) 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("Creating JavaBBinder %p\n", this); 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android_atomic_inc(&gNumLocalRefs); 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project incRefsCreated(env); 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool checkSubclass(const void* subclassID) const 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return subclassID == &gBinderOffsets; 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject object() const 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mObject; 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprotected: 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual ~JavaBBinder() 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("Destroying JavaBBinder %p\n", this); 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android_atomic_dec(&gNumLocalRefs); 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv* env = javavm_to_jnienv(mVM); 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->DeleteGlobalRef(mObject); 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t onTransact( 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags = 0) 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv* env = javavm_to_jnienv(mVM); 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("onTransact() on %p calling object %p in env %p vm %p\n", this, mObject, env, mVM); 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 274727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick IPCThreadState* thread_state = IPCThreadState::self(); 275727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick const int strict_policy_before = thread_state->getStrictModePolicy(); 2760234376503ce421c4b871d5d811c541f5094301aBrad Fitzpatrick thread_state->setLastTransactionBinderFlags(flags); 277727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("Transact from %p to Java code sending: ", this); 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //data.print(); 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("\n"); 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jboolean res = env->CallBooleanMethod(mObject, gBinderOffsets.mExecTransact, 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project code, (int32_t)&data, (int32_t)reply, flags); 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jthrowable excep = env->ExceptionOccurred(); 284727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick 285727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick // Restore the Java binder thread's state if it changed while 286727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick // processing a call (as it would if the Parcel's header had a 287727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick // new policy mask and Parcel.enforceInterface() changed 288727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick // it...) 289727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick const int strict_policy_after = thread_state->getStrictModePolicy(); 290727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick if (strict_policy_after != strict_policy_before) { 291727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick // Our thread-local... 292727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick thread_state->setStrictModePolicy(strict_policy_before); 293727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick // And the Java-level thread-local... 294727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick set_dalvik_blockguard_policy(env, strict_policy_before); 295727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick } 296727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (excep) { 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project report_exception(env, excep, 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "*** Uncaught remote exception! " 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "(Exceptions are not yet supported across processes.)"); 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res = JNI_FALSE; 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* clean up JNI local ref -- we don't return to Java code */ 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->DeleteLocalRef(excep); 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //aout << "onTransact to Java code; result=" << res << endl 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // << "Transact from " << this << " to Java code returning " 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // << reply << ": " << *reply << endl; 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res != JNI_FALSE ? NO_ERROR : UNKNOWN_TRANSACTION; 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t dump(int fd, const Vector<String16>& args) 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JavaVM* const mVM; 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject const mObject; 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass JavaBBinderHolder : public RefBase 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 3280b41448506610f73302cc631677823fd8b865ea5Christopher Tate sp<JavaBBinder> get(JNIEnv* env, jobject obj) 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AutoMutex _l(mLock); 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<JavaBBinder> b = mBinder.promote(); 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (b == NULL) { 3330b41448506610f73302cc631677823fd8b865ea5Christopher Tate b = new JavaBBinder(env, obj); 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBinder = b; 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("Creating JavaBinder %p (refs %p) for Object %p, weakCount=%d\n", 3360b41448506610f73302cc631677823fd8b865ea5Christopher Tate b.get(), b->getWeakRefs(), obj, b->getWeakRefs()->getWeakCount()); 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return b; 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<JavaBBinder> getExisting() 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AutoMutex _l(mLock); 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBinder.promote(); 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex mLock; 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wp<JavaBBinder> mBinder; 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3550b41448506610f73302cc631677823fd8b865ea5Christopher Tate// Per-IBinder death recipient bookkeeping. This is how we reconcile local jobject 3560b41448506610f73302cc631677823fd8b865ea5Christopher Tate// death recipient references passed in through JNI with the permanent corresponding 3570b41448506610f73302cc631677823fd8b865ea5Christopher Tate// JavaDeathRecipient objects. 3580b41448506610f73302cc631677823fd8b865ea5Christopher Tate 3590b41448506610f73302cc631677823fd8b865ea5Christopher Tateclass JavaDeathRecipient; 3600b41448506610f73302cc631677823fd8b865ea5Christopher Tate 3610b41448506610f73302cc631677823fd8b865ea5Christopher Tateclass DeathRecipientList : public RefBase { 3620b41448506610f73302cc631677823fd8b865ea5Christopher Tate List< sp<JavaDeathRecipient> > mList; 3630b41448506610f73302cc631677823fd8b865ea5Christopher Tate Mutex mLock; 3640b41448506610f73302cc631677823fd8b865ea5Christopher Tate 3650b41448506610f73302cc631677823fd8b865ea5Christopher Tatepublic: 3660b41448506610f73302cc631677823fd8b865ea5Christopher Tate ~DeathRecipientList(); 3670b41448506610f73302cc631677823fd8b865ea5Christopher Tate 3680b41448506610f73302cc631677823fd8b865ea5Christopher Tate void add(const sp<JavaDeathRecipient>& recipient); 3690b41448506610f73302cc631677823fd8b865ea5Christopher Tate void remove(const sp<JavaDeathRecipient>& recipient); 3700b41448506610f73302cc631677823fd8b865ea5Christopher Tate sp<JavaDeathRecipient> find(jobject recipient); 3710b41448506610f73302cc631677823fd8b865ea5Christopher Tate}; 3720b41448506610f73302cc631677823fd8b865ea5Christopher Tate 3730b41448506610f73302cc631677823fd8b865ea5Christopher Tate// ---------------------------------------------------------------------------- 3740b41448506610f73302cc631677823fd8b865ea5Christopher Tate 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass JavaDeathRecipient : public IBinder::DeathRecipient 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 378bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate JavaDeathRecipient(JNIEnv* env, jobject object, const sp<DeathRecipientList>& list) 3790b41448506610f73302cc631677823fd8b865ea5Christopher Tate : mVM(jnienv_to_javavm(env)), mObject(env->NewGlobalRef(object)), mList(list) 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3810b41448506610f73302cc631677823fd8b865ea5Christopher Tate // These objects manage their own lifetimes so are responsible for final bookkeeping. 3820b41448506610f73302cc631677823fd8b865ea5Christopher Tate // The list holds a strong reference to this object. 383bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate list->add(this); 3840b41448506610f73302cc631677823fd8b865ea5Christopher Tate 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android_atomic_inc(&gNumDeathRefs); 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project incRefsCreated(env); 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void binderDied(const wp<IBinder>& who) 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv* env = javavm_to_jnienv(mVM); 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("Receiving binderDied() on JavaDeathRecipient %p\n", this); 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->CallStaticVoidMethod(gBinderProxyOffsets.mClass, 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderProxyOffsets.mSendDeathNotice, mObject); 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jthrowable excep = env->ExceptionOccurred(); 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (excep) { 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project report_exception(env, excep, 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "*** Uncaught exception returned from death notification!"); 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clearReference(); 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void clearReference() 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 408bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate sp<DeathRecipientList> list = mList.promote(); 409bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate if (list != NULL) { 410bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate list->remove(this); 411bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate } 4120b41448506610f73302cc631677823fd8b865ea5Christopher Tate } 4130b41448506610f73302cc631677823fd8b865ea5Christopher Tate 4140b41448506610f73302cc631677823fd8b865ea5Christopher Tate bool matches(jobject obj) { 4150b41448506610f73302cc631677823fd8b865ea5Christopher Tate JNIEnv* env = javavm_to_jnienv(mVM); 4160b41448506610f73302cc631677823fd8b865ea5Christopher Tate return env->IsSameObject(obj, mObject); 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprotected: 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual ~JavaDeathRecipient() 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //LOGI("Removing death ref: recipient=%p\n", mObject); 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android_atomic_dec(&gNumDeathRefs); 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv* env = javavm_to_jnienv(mVM); 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->DeleteGlobalRef(mObject); 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JavaVM* const mVM; 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject const mObject; 431bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate wp<DeathRecipientList> mList; 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4360b41448506610f73302cc631677823fd8b865ea5Christopher TateDeathRecipientList::~DeathRecipientList() { 4370b41448506610f73302cc631677823fd8b865ea5Christopher Tate AutoMutex _l(mLock); 4380b41448506610f73302cc631677823fd8b865ea5Christopher Tate 4390b41448506610f73302cc631677823fd8b865ea5Christopher Tate // Should never happen -- the JavaDeathRecipient objects that have added themselves 4400b41448506610f73302cc631677823fd8b865ea5Christopher Tate // to the list are holding references on the list object. Only when they are torn 4410b41448506610f73302cc631677823fd8b865ea5Christopher Tate // down can the list header be destroyed. 4420b41448506610f73302cc631677823fd8b865ea5Christopher Tate if (mList.size() > 0) { 443bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate LOGE("Retiring DRL %p with extant death recipients\n", this); 4440b41448506610f73302cc631677823fd8b865ea5Christopher Tate } 4450b41448506610f73302cc631677823fd8b865ea5Christopher Tate} 4460b41448506610f73302cc631677823fd8b865ea5Christopher Tate 4470b41448506610f73302cc631677823fd8b865ea5Christopher Tatevoid DeathRecipientList::add(const sp<JavaDeathRecipient>& recipient) { 4480b41448506610f73302cc631677823fd8b865ea5Christopher Tate AutoMutex _l(mLock); 4490b41448506610f73302cc631677823fd8b865ea5Christopher Tate 4500b41448506610f73302cc631677823fd8b865ea5Christopher Tate mList.push_back(recipient); 4510b41448506610f73302cc631677823fd8b865ea5Christopher Tate} 4520b41448506610f73302cc631677823fd8b865ea5Christopher Tate 4530b41448506610f73302cc631677823fd8b865ea5Christopher Tatevoid DeathRecipientList::remove(const sp<JavaDeathRecipient>& recipient) { 4540b41448506610f73302cc631677823fd8b865ea5Christopher Tate AutoMutex _l(mLock); 4550b41448506610f73302cc631677823fd8b865ea5Christopher Tate 4560b41448506610f73302cc631677823fd8b865ea5Christopher Tate List< sp<JavaDeathRecipient> >::iterator iter; 4570b41448506610f73302cc631677823fd8b865ea5Christopher Tate for (iter = mList.begin(); iter != mList.end(); iter++) { 4580b41448506610f73302cc631677823fd8b865ea5Christopher Tate if (*iter == recipient) { 4590b41448506610f73302cc631677823fd8b865ea5Christopher Tate mList.erase(iter); 4600b41448506610f73302cc631677823fd8b865ea5Christopher Tate return; 4610b41448506610f73302cc631677823fd8b865ea5Christopher Tate } 4620b41448506610f73302cc631677823fd8b865ea5Christopher Tate } 4630b41448506610f73302cc631677823fd8b865ea5Christopher Tate} 4640b41448506610f73302cc631677823fd8b865ea5Christopher Tate 4650b41448506610f73302cc631677823fd8b865ea5Christopher Tatesp<JavaDeathRecipient> DeathRecipientList::find(jobject recipient) { 4660b41448506610f73302cc631677823fd8b865ea5Christopher Tate AutoMutex _l(mLock); 4670b41448506610f73302cc631677823fd8b865ea5Christopher Tate 4680b41448506610f73302cc631677823fd8b865ea5Christopher Tate List< sp<JavaDeathRecipient> >::iterator iter; 4690b41448506610f73302cc631677823fd8b865ea5Christopher Tate for (iter = mList.begin(); iter != mList.end(); iter++) { 4700b41448506610f73302cc631677823fd8b865ea5Christopher Tate if ((*iter)->matches(recipient)) { 4710b41448506610f73302cc631677823fd8b865ea5Christopher Tate return *iter; 4720b41448506610f73302cc631677823fd8b865ea5Christopher Tate } 4730b41448506610f73302cc631677823fd8b865ea5Christopher Tate } 4740b41448506610f73302cc631677823fd8b865ea5Christopher Tate return NULL; 4750b41448506610f73302cc631677823fd8b865ea5Christopher Tate} 4760b41448506610f73302cc631677823fd8b865ea5Christopher Tate 4770b41448506610f73302cc631677823fd8b865ea5Christopher Tate// ---------------------------------------------------------------------------- 4780b41448506610f73302cc631677823fd8b865ea5Christopher Tate 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void proxy_cleanup(const void* id, void* obj, void* cleanupCookie) 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android_atomic_dec(&gNumProxyRefs); 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv* env = javavm_to_jnienv((JavaVM*)cleanupCookie); 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->DeleteGlobalRef((jobject)obj); 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic Mutex mProxyLock; 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjobject javaObjectForIBinder(JNIEnv* env, const sp<IBinder>& val) 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val == NULL) return NULL; 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val->checkSubclass(&gBinderOffsets)) { 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // One of our own! 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject object = static_cast<JavaBBinder*>(val.get())->object(); 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("objectForBinder %p: it's our own %p!\n", val.get(), object); 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return object; 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // For the rest of the function we will hold this lock, to serialize 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // looking/creation of Java proxies for native Binder proxies. 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AutoMutex _l(mProxyLock); 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Someone else's... do we know about it? 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject object = (jobject)val->findObject(&gBinderProxyOffsets); 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (object != NULL) { 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject res = env->CallObjectMethod(object, gWeakReferenceOffsets.mGet); 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != NULL) { 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("objectForBinder %p: found existing %p!\n", val.get(), res); 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("Proxy object %p of IBinder %p no longer in working set!!!", object, val.get()); 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android_atomic_dec(&gNumProxyRefs); 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val->detachObject(&gBinderProxyOffsets); 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->DeleteGlobalRef(object); 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project object = env->NewObject(gBinderProxyOffsets.mClass, gBinderProxyOffsets.mConstructor); 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (object != NULL) { 521bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate LOGV("objectForBinder %p: created new proxy %p !\n", val.get(), object); 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The proxy holds a reference to the native object. 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(object, gBinderProxyOffsets.mObject, (int)val.get()); 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val->incStrong(object); 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The native object needs to hold a weak reference back to the 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // proxy, so we can retrieve the same proxy if it is still active. 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject refObject = env->NewGlobalRef( 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->GetObjectField(object, gBinderProxyOffsets.mSelf)); 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val->attachObject(&gBinderProxyOffsets, refObject, 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jnienv_to_javavm(env), proxy_cleanup); 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 533bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate // Also remember the death recipients registered on this proxy 534bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate sp<DeathRecipientList> drl = new DeathRecipientList; 535bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate drl->incStrong((void*)javaObjectForIBinder); 536bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate env->SetIntField(object, gBinderProxyOffsets.mOrgue, reinterpret_cast<jint>(drl.get())); 537bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Note that a new object reference has been created. 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android_atomic_inc(&gNumProxyRefs); 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project incRefsCreated(env); 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return object; 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<IBinder> ibinderForJavaObject(JNIEnv* env, jobject obj) 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (obj == NULL) return NULL; 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (env->IsInstanceOf(obj, gBinderOffsets.mClass)) { 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JavaBBinderHolder* jbh = (JavaBBinderHolder*) 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->GetIntField(obj, gBinderOffsets.mObject); 5530b41448506610f73302cc631677823fd8b865ea5Christopher Tate return jbh != NULL ? jbh->get(env, obj) : NULL; 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (env->IsInstanceOf(obj, gBinderProxyOffsets.mClass)) { 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (IBinder*) 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->GetIntField(obj, gBinderProxyOffsets.mObject); 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGW("ibinderForJavaObject: %p is not a Binder object", obj); 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectParcel* parcelForJavaObject(JNIEnv* env, jobject obj) 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (obj) { 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* p = (Parcel*)env->GetIntField(obj, gParcelOffsets.mObject); 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p != NULL) { 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p; 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", "Parcel has been finalized!"); 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjobject newFileDescriptor(JNIEnv* env, int fd) 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject object = env->NewObject( 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gFileDescriptorOffsets.mClass, gFileDescriptorOffsets.mConstructor); 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (object != NULL) { 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //LOGI("Created new FileDescriptor %p with fd %d\n", object, fd); 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(object, gFileDescriptorOffsets.mDescriptor, fd); 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return object; 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjobject newParcelFileDescriptor(JNIEnv* env, jobject fileDesc) 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return env->NewObject( 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gParcelFileDescriptorOffsets.mClass, gParcelFileDescriptorOffsets.mConstructor, fileDesc); 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid signalExceptionForError(JNIEnv* env, jobject obj, status_t err) 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (err) { 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case UNKNOWN_ERROR: 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/RuntimeException", "Unknown error"); 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case NO_MEMORY: 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/OutOfMemoryError", NULL); 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case INVALID_OPERATION: 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/UnsupportedOperationException", NULL); 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BAD_VALUE: 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BAD_INDEX: 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IndexOutOfBoundsException", NULL); 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BAD_TYPE: 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case NAME_NOT_FOUND: 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/util/NoSuchElementException", NULL); 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PERMISSION_DENIED: 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/SecurityException", NULL); 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case NOT_ENOUGH_DATA: 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "android/os/ParcelFormatException", "Not enough data"); 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case NO_INIT: 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/RuntimeException", "Not initialized"); 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case ALREADY_EXISTS: 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/RuntimeException", "Item already exists"); 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DEAD_OBJECT: 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "android/os/DeadObjectException", NULL); 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case UNKNOWN_TRANSACTION: 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/RuntimeException", "Unknown transaction code"); 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case FAILED_TRANSACTION: 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("!!! FAILED BINDER TRANSACTION !!!"); 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //jniThrowException(env, "java/lang/OutOfMemoryError", "Binder transaction too large"); 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("Unknown binder error code. 0x%x", err); 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_os_Binder_getCallingPid(JNIEnv* env, jobject clazz) 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return IPCThreadState::self()->getCallingPid(); 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_os_Binder_getCallingUid(JNIEnv* env, jobject clazz) 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return IPCThreadState::self()->getCallingUid(); 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jlong android_os_Binder_clearCallingIdentity(JNIEnv* env, jobject clazz) 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return IPCThreadState::self()->clearCallingIdentity(); 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Binder_restoreCallingIdentity(JNIEnv* env, jobject clazz, jlong token) 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IPCThreadState::self()->restoreCallingIdentity(token); 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 669727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrickstatic void android_os_Binder_setThreadStrictModePolicy(JNIEnv* env, jobject clazz, jint policyMask) 670727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick{ 671727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick IPCThreadState::self()->setStrictModePolicy(policyMask); 672727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick} 673727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick 674727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrickstatic jint android_os_Binder_getThreadStrictModePolicy(JNIEnv* env, jobject clazz) 675727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick{ 676727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick return IPCThreadState::self()->getStrictModePolicy(); 677727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick} 678727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Binder_flushPendingCommands(JNIEnv* env, jobject clazz) 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IPCThreadState::self()->flushCommands(); 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6840b41448506610f73302cc631677823fd8b865ea5Christopher Tatestatic void android_os_Binder_init(JNIEnv* env, jobject obj) 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6860b41448506610f73302cc631677823fd8b865ea5Christopher Tate JavaBBinderHolder* jbh = new JavaBBinderHolder(); 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (jbh == NULL) { 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/OutOfMemoryError", NULL); 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6910b41448506610f73302cc631677823fd8b865ea5Christopher Tate LOGV("Java Binder %p: acquiring first ref on holder %p", obj, jbh); 6920b41448506610f73302cc631677823fd8b865ea5Christopher Tate jbh->incStrong((void*)android_os_Binder_init); 6930b41448506610f73302cc631677823fd8b865ea5Christopher Tate env->SetIntField(obj, gBinderOffsets.mObject, (int)jbh); 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6960b41448506610f73302cc631677823fd8b865ea5Christopher Tatestatic void android_os_Binder_destroy(JNIEnv* env, jobject obj) 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JavaBBinderHolder* jbh = (JavaBBinderHolder*) 6990b41448506610f73302cc631677823fd8b865ea5Christopher Tate env->GetIntField(obj, gBinderOffsets.mObject); 700582763ae4e2910b4059dccdfd30a447e9fc974d5Jeff Brown if (jbh != NULL) { 7010b41448506610f73302cc631677823fd8b865ea5Christopher Tate env->SetIntField(obj, gBinderOffsets.mObject, 0); 7020b41448506610f73302cc631677823fd8b865ea5Christopher Tate LOGV("Java Binder %p: removing ref on holder %p", obj, jbh); 7030b41448506610f73302cc631677823fd8b865ea5Christopher Tate jbh->decStrong((void*)android_os_Binder_init); 704582763ae4e2910b4059dccdfd30a447e9fc974d5Jeff Brown } else { 705582763ae4e2910b4059dccdfd30a447e9fc974d5Jeff Brown // Encountering an uninitialized binder is harmless. All it means is that 706582763ae4e2910b4059dccdfd30a447e9fc974d5Jeff Brown // the Binder was only partially initialized when its finalizer ran and called 707582763ae4e2910b4059dccdfd30a447e9fc974d5Jeff Brown // destroy(). The Binder could be partially initialized for several reasons. 708582763ae4e2910b4059dccdfd30a447e9fc974d5Jeff Brown // For example, a Binder subclass constructor might have thrown an exception before 709582763ae4e2910b4059dccdfd30a447e9fc974d5Jeff Brown // it could delegate to its superclass's constructor. Consequently init() would 710582763ae4e2910b4059dccdfd30a447e9fc974d5Jeff Brown // not have been called and the holder pointer would remain NULL. 7110b41448506610f73302cc631677823fd8b865ea5Christopher Tate LOGV("Java Binder %p: ignoring uninitialized binder", obj); 712582763ae4e2910b4059dccdfd30a447e9fc974d5Jeff Brown } 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const JNINativeMethod gBinderMethods[] = { 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* name, signature, funcPtr */ 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "getCallingPid", "()I", (void*)android_os_Binder_getCallingPid }, 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "getCallingUid", "()I", (void*)android_os_Binder_getCallingUid }, 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "clearCallingIdentity", "()J", (void*)android_os_Binder_clearCallingIdentity }, 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "restoreCallingIdentity", "(J)V", (void*)android_os_Binder_restoreCallingIdentity }, 723727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick { "setThreadStrictModePolicy", "(I)V", (void*)android_os_Binder_setThreadStrictModePolicy }, 724727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick { "getThreadStrictModePolicy", "()I", (void*)android_os_Binder_getThreadStrictModePolicy }, 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "flushPendingCommands", "()V", (void*)android_os_Binder_flushPendingCommands }, 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "init", "()V", (void*)android_os_Binder_init }, 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "destroy", "()V", (void*)android_os_Binder_destroy } 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst char* const kBinderPathName = "android/os/Binder"; 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int int_register_android_os_Binder(JNIEnv* env) 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass clazz; 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clazz = env->FindClass(kBinderPathName); 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_FATAL_IF(clazz == NULL, "Unable to find class android.os.Binder"); 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderOffsets.mClass = (jclass) env->NewGlobalRef(clazz); 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderOffsets.mExecTransact 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = env->GetMethodID(clazz, "execTransact", "(IIII)Z"); 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assert(gBinderOffsets.mExecTransact); 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderOffsets.mObject 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = env->GetFieldID(clazz, "mObject", "I"); 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assert(gBinderOffsets.mObject); 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AndroidRuntime::registerNativeMethods( 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env, kBinderPathName, 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderMethods, NELEM(gBinderMethods)); 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjint android_os_Debug_getLocalObjectCount(JNIEnv* env, jobject clazz) 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return gNumLocalRefs; 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjint android_os_Debug_getProxyObjectCount(JNIEnv* env, jobject clazz) 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return gNumProxyRefs; 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjint android_os_Debug_getDeathObjectCount(JNIEnv* env, jobject clazz) 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return gNumDeathRefs; 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jobject android_os_BinderInternal_getContextObject(JNIEnv* env, jobject clazz) 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IBinder> b = ProcessState::self()->getContextObject(NULL); 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return javaObjectForIBinder(env, b); 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_BinderInternal_joinThreadPool(JNIEnv* env, jobject clazz) 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IBinder> b = ProcessState::self()->getContextObject(NULL); 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android::IPCThreadState::self()->joinThreadPool(); 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 792887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackbornstatic void android_os_BinderInternal_disableBackgroundScheduling(JNIEnv* env, 793887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn jobject clazz, jboolean disable) 794887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn{ 795887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn IPCThreadState::disableBackgroundScheduling(disable ? true : false); 796887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn} 797887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_BinderInternal_handleGc(JNIEnv* env, jobject clazz) 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("Gc has executed, clearing binder ops"); 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android_atomic_and(0, &gNumRefsCreated); 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const JNINativeMethod gBinderInternalMethods[] = { 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* name, signature, funcPtr */ 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "getContextObject", "()Landroid/os/IBinder;", (void*)android_os_BinderInternal_getContextObject }, 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "joinThreadPool", "()V", (void*)android_os_BinderInternal_joinThreadPool }, 810887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn { "disableBackgroundScheduling", "(Z)V", (void*)android_os_BinderInternal_disableBackgroundScheduling }, 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "handleGc", "()V", (void*)android_os_BinderInternal_handleGc } 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst char* const kBinderInternalPathName = "com/android/internal/os/BinderInternal"; 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int int_register_android_os_BinderInternal(JNIEnv* env) 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass clazz; 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clazz = env->FindClass(kBinderInternalPathName); 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_FATAL_IF(clazz == NULL, "Unable to find class com.android.internal.os.BinderInternal"); 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderInternalOffsets.mClass = (jclass) env->NewGlobalRef(clazz); 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderInternalOffsets.mForceGc 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = env->GetStaticMethodID(clazz, "forceBinderGc", "()V"); 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assert(gBinderInternalOffsets.mForceGc); 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AndroidRuntime::registerNativeMethods( 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env, kBinderInternalPathName, 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderInternalMethods, NELEM(gBinderInternalMethods)); 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_os_BinderProxy_pingBinder(JNIEnv* env, jobject obj) 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder* target = (IBinder*) 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->GetIntField(obj, gBinderProxyOffsets.mObject); 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (target == NULL) { 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = target->pingBinder(); 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err == NO_ERROR ? JNI_TRUE : JNI_FALSE; 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jstring android_os_BinderProxy_getInterfaceDescriptor(JNIEnv* env, jobject obj) 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder* target = (IBinder*) env->GetIntField(obj, gBinderProxyOffsets.mObject); 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (target != NULL) { 8522c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick const String16& desc = target->getInterfaceDescriptor(); 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return env->NewString(desc.string(), desc.size()); 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/RuntimeException", 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "No binder found for object"); 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_os_BinderProxy_isBinderAlive(JNIEnv* env, jobject obj) 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder* target = (IBinder*) 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->GetIntField(obj, gBinderProxyOffsets.mObject); 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (target == NULL) { 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool alive = target->isBinderAlive(); 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return alive ? JNI_TRUE : JNI_FALSE; 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8712c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrickstatic int getprocname(pid_t pid, char *buf, size_t len) { 8722c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick char filename[20]; 8732c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick FILE *f; 8742c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick 8752c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick sprintf(filename, "/proc/%d/cmdline", pid); 8762c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick f = fopen(filename, "r"); 8772c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick if (!f) { *buf = '\0'; return 1; } 8782c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick if (!fgets(buf, len, f)) { *buf = '\0'; return 2; } 8792c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick fclose(f); 8802c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick return 0; 8812c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick} 8822c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick 8832c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrickstatic bool push_eventlog_string(char** pos, const char* end, const char* str) { 8842c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick jint len = strlen(str); 8852c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick int space_needed = 1 + sizeof(len) + len; 8862c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick if (end - *pos < space_needed) { 8872c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick LOGW("not enough space for string. remain=%d; needed=%d", 8882c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick (end - *pos), space_needed); 8892c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick return false; 8902c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick } 8912c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick **pos = EVENT_TYPE_STRING; 8922c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick (*pos)++; 8932c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick memcpy(*pos, &len, sizeof(len)); 8942c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick *pos += sizeof(len); 8952c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick memcpy(*pos, str, len); 8962c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick *pos += len; 8972c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick return true; 8982c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick} 8992c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick 9002c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrickstatic bool push_eventlog_int(char** pos, const char* end, jint val) { 9012c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick int space_needed = 1 + sizeof(val); 9022c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick if (end - *pos < space_needed) { 9032c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick LOGW("not enough space for int. remain=%d; needed=%d", 9042c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick (end - *pos), space_needed); 9052c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick return false; 9062c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick } 9072c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick **pos = EVENT_TYPE_INT; 9082c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick (*pos)++; 9092c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick memcpy(*pos, &val, sizeof(val)); 9102c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick *pos += sizeof(val); 9112c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick return true; 9122c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick} 9132c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick 9142c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick// From frameworks/base/core/java/android/content/EventLogTags.logtags: 9152c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick#define LOGTAG_BINDER_OPERATION 52004 9162c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick 9172c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrickstatic void conditionally_log_binder_call(int64_t start_millis, 9182c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick IBinder* target, jint code) { 9192c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick int duration_ms = static_cast<int>(uptimeMillis() - start_millis); 9202c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick 9212c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick int sample_percent; 9222c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick if (duration_ms >= 500) { 9232c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick sample_percent = 100; 9242c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick } else { 9252c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick sample_percent = 100 * duration_ms / 500; 9262c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick if (sample_percent == 0) { 9272c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick return; 9282c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick } 9292c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick if (sample_percent < (random() % 100 + 1)) { 9302c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick return; 9312c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick } 9322c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick } 9332c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick 9342c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick char process_name[40]; 9352c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick getprocname(getpid(), process_name, sizeof(process_name)); 9362c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick String8 desc(target->getInterfaceDescriptor()); 9372c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick 9382c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick char buf[LOGGER_ENTRY_MAX_PAYLOAD]; 9392c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick buf[0] = EVENT_TYPE_LIST; 9402c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick buf[1] = 5; 9412c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick char* pos = &buf[2]; 9422c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick char* end = &buf[LOGGER_ENTRY_MAX_PAYLOAD - 1]; // leave room for final \n 9432c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick if (!push_eventlog_string(&pos, end, desc.string())) return; 9442c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick if (!push_eventlog_int(&pos, end, code)) return; 9452c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick if (!push_eventlog_int(&pos, end, duration_ms)) return; 9462c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick if (!push_eventlog_string(&pos, end, process_name)) return; 9472c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick if (!push_eventlog_int(&pos, end, sample_percent)) return; 9482c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick *(pos++) = '\n'; // conventional with EVENT_TYPE_LIST apparently. 9492c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick android_bWriteLog(LOGTAG_BINDER_OPERATION, buf, pos - buf); 9502c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick} 9512c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick 952ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick// We only measure binder call durations to potentially log them if 953ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick// we're on the main thread. Unfortunately sim-eng doesn't seem to 954ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick// have gettid, so we just ignore this and don't log if we can't 955ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick// get the thread id. 956ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrickstatic bool should_time_binder_calls() { 9575348c014129b766d621ef82a6e42007009ffc310Brad Fitzpatrick#ifdef HAVE_GETTID 9585348c014129b766d621ef82a6e42007009ffc310Brad Fitzpatrick return (getpid() == androidGetTid()); 959ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick#else 960ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick#warning no gettid(), so not logging Binder calls... 961ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick return false; 962ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick#endif 963ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick} 964ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_os_BinderProxy_transact(JNIEnv* env, jobject obj, 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint code, jobject dataObj, 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject replyObj, jint flags) 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dataObj == NULL) { 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/NullPointerException", NULL); 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* data = parcelForJavaObject(env, dataObj); 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (data == NULL) { 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* reply = parcelForJavaObject(env, replyObj); 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (reply == NULL && replyObj != NULL) { 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder* target = (IBinder*) 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->GetIntField(obj, gBinderProxyOffsets.mObject); 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (target == NULL) { 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", "Binder has been finalized!"); 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("Java code calling transact on %p in Java object %p with code %d\n", 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project target, obj, code); 9922c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick 9932c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick // Only log the binder call duration for things on the Java-level main thread. 994ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick // But if we don't 995ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick const bool time_binder_calls = should_time_binder_calls(); 996ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick 9972c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick int64_t start_millis; 998ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick if (time_binder_calls) { 9992c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick start_millis = uptimeMillis(); 10002c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick } 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("Transact from Java code to %p sending: ", target); data->print(); 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = target->transact(code, *data, reply, flags); 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //if (reply) printf("Transact from Java code to %p received: ", target); reply->print(); 1004ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick if (time_binder_calls) { 10052c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick conditionally_log_binder_call(start_millis, target, code); 10062c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick } 10072c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err == NO_ERROR) { 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_TRUE; 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (err == UNKNOWN_TRANSACTION) { 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project signalExceptionForError(env, obj, err); 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_BinderProxy_linkToDeath(JNIEnv* env, jobject obj, 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject recipient, jint flags) 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (recipient == NULL) { 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/NullPointerException", NULL); 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder* target = (IBinder*) 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->GetIntField(obj, gBinderProxyOffsets.mObject); 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (target == NULL) { 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGW("Binder has been finalized when calling linkToDeath() with recip=%p)\n", recipient); 10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assert(false); 10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("linkToDeath: binder=%p recipient=%p\n", target, recipient); 10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!target->localBinder()) { 1036bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate DeathRecipientList* list = (DeathRecipientList*) 1037bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate env->GetIntField(obj, gBinderProxyOffsets.mOrgue); 1038bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate sp<JavaDeathRecipient> jdr = new JavaDeathRecipient(env, recipient, list); 10390b41448506610f73302cc631677823fd8b865ea5Christopher Tate status_t err = target->linkToDeath(jdr, NULL, flags); 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Failure adding the death recipient, so clear its reference 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // now. 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jdr->clearReference(); 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project signalExceptionForError(env, obj, err); 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_os_BinderProxy_unlinkToDeath(JNIEnv* env, jobject obj, 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject recipient, jint flags) 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jboolean res = JNI_FALSE; 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (recipient == NULL) { 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/NullPointerException", NULL); 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder* target = (IBinder*) 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->GetIntField(obj, gBinderProxyOffsets.mObject); 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (target == NULL) { 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGW("Binder has been finalized when calling linkToDeath() with recip=%p)\n", recipient); 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("unlinkToDeath: binder=%p recipient=%p\n", target, recipient); 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!target->localBinder()) { 10680b41448506610f73302cc631677823fd8b865ea5Christopher Tate status_t err = NAME_NOT_FOUND; 1069bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate 1070bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate // If we find the matching recipient, proceed to unlink using that 1071bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate DeathRecipientList* list = (DeathRecipientList*) 1072bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate env->GetIntField(obj, gBinderProxyOffsets.mOrgue); 1073bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate sp<JavaDeathRecipient> origJDR = list->find(recipient); 10740b41448506610f73302cc631677823fd8b865ea5Christopher Tate if (origJDR != NULL) { 10750b41448506610f73302cc631677823fd8b865ea5Christopher Tate wp<IBinder::DeathRecipient> dr; 10760b41448506610f73302cc631677823fd8b865ea5Christopher Tate err = target->unlinkToDeath(origJDR, NULL, flags, &dr); 10770b41448506610f73302cc631677823fd8b865ea5Christopher Tate if (err == NO_ERROR && dr != NULL) { 10780b41448506610f73302cc631677823fd8b865ea5Christopher Tate sp<IBinder::DeathRecipient> sdr = dr.promote(); 10790b41448506610f73302cc631677823fd8b865ea5Christopher Tate JavaDeathRecipient* jdr = static_cast<JavaDeathRecipient*>(sdr.get()); 10800b41448506610f73302cc631677823fd8b865ea5Christopher Tate if (jdr != NULL) { 10810b41448506610f73302cc631677823fd8b865ea5Christopher Tate jdr->clearReference(); 10820b41448506610f73302cc631677823fd8b865ea5Christopher Tate } 10830b41448506610f73302cc631677823fd8b865ea5Christopher Tate } 10840b41448506610f73302cc631677823fd8b865ea5Christopher Tate } 10850b41448506610f73302cc631677823fd8b865ea5Christopher Tate 10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err == NO_ERROR || err == DEAD_OBJECT) { 10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res = JNI_TRUE; 10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/util/NoSuchElementException", 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Death link does not exist"); 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_BinderProxy_destroy(JNIEnv* env, jobject obj) 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder* b = (IBinder*) 1100bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate env->GetIntField(obj, gBinderProxyOffsets.mObject); 1101bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate DeathRecipientList* drl = (DeathRecipientList*) 1102bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate env->GetIntField(obj, gBinderProxyOffsets.mOrgue); 1103bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate 1104bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate LOGV("Destroying BinderProxy %p: binder=%p drl=%p\n", obj, b, drl); 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(obj, gBinderProxyOffsets.mObject, 0); 1106bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate env->SetIntField(obj, gBinderProxyOffsets.mOrgue, 0); 1107bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate drl->decStrong((void*)javaObjectForIBinder); 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project b->decStrong(obj); 11090b41448506610f73302cc631677823fd8b865ea5Christopher Tate 1110bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate IPCThreadState::self()->flushCommands(); 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const JNINativeMethod gBinderProxyMethods[] = { 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* name, signature, funcPtr */ 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"pingBinder", "()Z", (void*)android_os_BinderProxy_pingBinder}, 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"isBinderAlive", "()Z", (void*)android_os_BinderProxy_isBinderAlive}, 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"getInterfaceDescriptor", "()Ljava/lang/String;", (void*)android_os_BinderProxy_getInterfaceDescriptor}, 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"transact", "(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z", (void*)android_os_BinderProxy_transact}, 11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"linkToDeath", "(Landroid/os/IBinder$DeathRecipient;I)V", (void*)android_os_BinderProxy_linkToDeath}, 11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"unlinkToDeath", "(Landroid/os/IBinder$DeathRecipient;I)Z", (void*)android_os_BinderProxy_unlinkToDeath}, 11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"destroy", "()V", (void*)android_os_BinderProxy_destroy}, 11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst char* const kBinderProxyPathName = "android/os/BinderProxy"; 11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int int_register_android_os_BinderProxy(JNIEnv* env) 11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass clazz; 11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clazz = env->FindClass("java/lang/ref/WeakReference"); 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_FATAL_IF(clazz == NULL, "Unable to find class java.lang.ref.WeakReference"); 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gWeakReferenceOffsets.mClass = (jclass) env->NewGlobalRef(clazz); 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gWeakReferenceOffsets.mGet 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = env->GetMethodID(clazz, "get", "()Ljava/lang/Object;"); 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assert(gWeakReferenceOffsets.mGet); 11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clazz = env->FindClass("java/lang/Error"); 11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_FATAL_IF(clazz == NULL, "Unable to find class java.lang.Error"); 11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gErrorOffsets.mClass = (jclass) env->NewGlobalRef(clazz); 11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clazz = env->FindClass(kBinderProxyPathName); 11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_FATAL_IF(clazz == NULL, "Unable to find class android.os.BinderProxy"); 11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderProxyOffsets.mClass = (jclass) env->NewGlobalRef(clazz); 11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderProxyOffsets.mConstructor 11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = env->GetMethodID(clazz, "<init>", "()V"); 11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assert(gBinderProxyOffsets.mConstructor); 11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderProxyOffsets.mSendDeathNotice 11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = env->GetStaticMethodID(clazz, "sendDeathNotice", "(Landroid/os/IBinder$DeathRecipient;)V"); 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assert(gBinderProxyOffsets.mSendDeathNotice); 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderProxyOffsets.mObject 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = env->GetFieldID(clazz, "mObject", "I"); 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assert(gBinderProxyOffsets.mObject); 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderProxyOffsets.mSelf 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = env->GetFieldID(clazz, "mSelf", "Ljava/lang/ref/WeakReference;"); 11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assert(gBinderProxyOffsets.mSelf); 1160bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate gBinderProxyOffsets.mOrgue 1161bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate = env->GetFieldID(clazz, "mOrgue", "I"); 1162bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate assert(gBinderProxyOffsets.mOrgue); 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AndroidRuntime::registerNativeMethods( 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env, kBinderProxyPathName, 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderProxyMethods, NELEM(gBinderProxyMethods)); 11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_os_Parcel_dataSize(JNIEnv* env, jobject clazz) 11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return parcel ? parcel->dataSize() : 0; 11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_os_Parcel_dataAvail(JNIEnv* env, jobject clazz) 11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return parcel ? parcel->dataAvail() : 0; 11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_os_Parcel_dataPosition(JNIEnv* env, jobject clazz) 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return parcel ? parcel->dataPosition() : 0; 11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_os_Parcel_dataCapacity(JNIEnv* env, jobject clazz) 11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return parcel ? parcel->dataCapacity() : 0; 11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Parcel_setDataSize(JNIEnv* env, jobject clazz, jint size) 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel != NULL) { 12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const status_t err = parcel->setDataSize(size); 12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/OutOfMemoryError", NULL); 12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Parcel_setDataPosition(JNIEnv* env, jobject clazz, jint pos) 12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel != NULL) { 12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcel->setDataPosition(pos); 12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Parcel_setDataCapacity(JNIEnv* env, jobject clazz, jint size) 12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel != NULL) { 12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const status_t err = parcel->setDataCapacity(size); 12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/OutOfMemoryError", NULL); 12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Parcel_writeNative(JNIEnv* env, jobject clazz, 12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject data, jint offset, 12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint length) 12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel == NULL) { 12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const status_t err = parcel->writeInt32(length); 12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/OutOfMemoryError", NULL); 12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1241a28b83ee04ca25100781f37a50665d6e1b05e3a2Elliott Hughes void* dest = parcel->writeInplace(length); 12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dest == NULL) { 12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/OutOfMemoryError", NULL); 12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jbyte* ar = (jbyte*)env->GetPrimitiveArrayCritical((jarray)data, 0); 12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ar) { 1249a28b83ee04ca25100781f37a50665d6e1b05e3a2Elliott Hughes memcpy(dest, ar + offset, length); 12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleasePrimitiveArrayCritical((jarray)data, ar, 0); 12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Parcel_writeInt(JNIEnv* env, jobject clazz, jint val) 12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel != NULL) { 12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const status_t err = parcel->writeInt32(val); 12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/OutOfMemoryError", NULL); 12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Parcel_writeLong(JNIEnv* env, jobject clazz, jlong val) 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel != NULL) { 12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const status_t err = parcel->writeInt64(val); 12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/OutOfMemoryError", NULL); 12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Parcel_writeFloat(JNIEnv* env, jobject clazz, jfloat val) 12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel != NULL) { 12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const status_t err = parcel->writeFloat(val); 12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/OutOfMemoryError", NULL); 12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Parcel_writeDouble(JNIEnv* env, jobject clazz, jdouble val) 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel != NULL) { 12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const status_t err = parcel->writeDouble(val); 12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/OutOfMemoryError", NULL); 12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Parcel_writeString(JNIEnv* env, jobject clazz, jstring val) 13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel != NULL) { 13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = NO_MEMORY; 13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val) { 13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const jchar* str = env->GetStringCritical(val, 0); 13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str) { 13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = parcel->writeString16(str, env->GetStringLength(val)); 13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringCritical(val, str); 13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = parcel->writeString16(NULL, 0); 13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/OutOfMemoryError", NULL); 13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Parcel_writeStrongBinder(JNIEnv* env, jobject clazz, jobject object) 13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel != NULL) { 13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const status_t err = parcel->writeStrongBinder(ibinderForJavaObject(env, object)); 13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/OutOfMemoryError", NULL); 13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Parcel_writeFileDescriptor(JNIEnv* env, jobject clazz, jobject object) 13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel != NULL) { 13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const status_t err = parcel->writeDupFileDescriptor( 13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->GetIntField(object, gFileDescriptorOffsets.mDescriptor)); 13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/OutOfMemoryError", NULL); 13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jbyteArray android_os_Parcel_createByteArray(JNIEnv* env, jobject clazz) 13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jbyteArray ret = NULL; 13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel != NULL) { 13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t len = parcel->readInt32(); 13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // sanity check the stored length against the true data size 13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (len >= 0 && len <= (int32_t)parcel->dataAvail()) { 13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ret = env->NewByteArray(len); 13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ret != NULL) { 13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jbyte* a2 = (jbyte*)env->GetPrimitiveArrayCritical(ret, 0); 13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a2) { 13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const void* data = parcel->readInplace(len); 13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memcpy(a2, data, len); 13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleasePrimitiveArrayCritical(ret, a2, 0); 13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ret; 13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_os_Parcel_readInt(JNIEnv* env, jobject clazz) 13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel != NULL) { 13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return parcel->readInt32(); 13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jlong android_os_Parcel_readLong(JNIEnv* env, jobject clazz) 13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel != NULL) { 13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return parcel->readInt64(); 13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jfloat android_os_Parcel_readFloat(JNIEnv* env, jobject clazz) 13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel != NULL) { 13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return parcel->readFloat(); 13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jdouble android_os_Parcel_readDouble(JNIEnv* env, jobject clazz) 13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel != NULL) { 13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return parcel->readDouble(); 14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jstring android_os_Parcel_readString(JNIEnv* env, jobject clazz) 14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel != NULL) { 14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t len; 14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char16_t* str = parcel->readString16Inplace(&len); 14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str) { 14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return env->NewString(str, len); 14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jobject android_os_Parcel_readStrongBinder(JNIEnv* env, jobject clazz) 14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel != NULL) { 14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return javaObjectForIBinder(env, parcel->readStrongBinder()); 14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jobject android_os_Parcel_readFileDescriptor(JNIEnv* env, jobject clazz) 14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel != NULL) { 14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int fd = parcel->readFileDescriptor(); 14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fd < 0) return NULL; 14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fd = dup(fd); 14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fd < 0) return NULL; 14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject object = env->NewObject( 14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gFileDescriptorOffsets.mClass, gFileDescriptorOffsets.mConstructor); 14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (object != NULL) { 14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //LOGI("Created new FileDescriptor %p with fd %d\n", object, fd); 14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(object, gFileDescriptorOffsets.mDescriptor, fd); 14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return object; 14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jobject android_os_Parcel_openFileDescriptor(JNIEnv* env, jobject clazz, 14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jstring name, jint mode) 14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name == NULL) { 14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/NullPointerException", NULL); 14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const jchar* str = env->GetStringCritical(name, 0); 14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str == NULL) { 14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Whatever, whatever. 14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 name8(str, env->GetStringLength(name)); 14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringCritical(name, str); 14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flags=0; 14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (mode&0x30000000) { 14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 0: 14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 0x10000000: 14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flags = O_RDONLY; 14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 0x20000000: 14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flags = O_WRONLY; 14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 0x30000000: 14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flags = O_RDWR; 14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mode&0x08000000) flags |= O_CREAT; 14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mode&0x04000000) flags |= O_TRUNC; 14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mode&0x02000000) flags |= O_APPEND; 14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int realMode = S_IRWXU|S_IRWXG; 14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mode&0x00000001) realMode |= S_IROTH; 14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mode&0x00000002) realMode |= S_IWOTH; 14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int fd = open(name8.string(), flags, realMode); 14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fd < 0) { 14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/io/FileNotFoundException", NULL); 14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject object = newFileDescriptor(env, fd); 14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (object == NULL) { 14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project close(fd); 14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return object; 14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Parcel_closeFileDescriptor(JNIEnv* env, jobject clazz, jobject object) 14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int fd = env->GetIntField(object, gFileDescriptorOffsets.mDescriptor); 14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fd >= 0) { 14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(object, gFileDescriptorOffsets.mDescriptor, -1); 15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //LOGI("Closing ParcelFileDescriptor %d\n", fd); 15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project close(fd); 15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1505c9119f5034d36f548bbddd8f60291e24ab4e270bDianne Hackbornstatic void android_os_Parcel_clearFileDescriptor(JNIEnv* env, jobject clazz, jobject object) 1506c9119f5034d36f548bbddd8f60291e24ab4e270bDianne Hackborn{ 1507c9119f5034d36f548bbddd8f60291e24ab4e270bDianne Hackborn int fd = env->GetIntField(object, gFileDescriptorOffsets.mDescriptor); 1508c9119f5034d36f548bbddd8f60291e24ab4e270bDianne Hackborn if (fd >= 0) { 1509c9119f5034d36f548bbddd8f60291e24ab4e270bDianne Hackborn env->SetIntField(object, gFileDescriptorOffsets.mDescriptor, -1); 1510c9119f5034d36f548bbddd8f60291e24ab4e270bDianne Hackborn } 1511c9119f5034d36f548bbddd8f60291e24ab4e270bDianne Hackborn} 1512c9119f5034d36f548bbddd8f60291e24ab4e270bDianne Hackborn 15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Parcel_freeBuffer(JNIEnv* env, jobject clazz) 15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t own = env->GetIntField(clazz, gParcelOffsets.mOwnObject); 15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (own) { 15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel != NULL) { 15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //LOGI("Parcel.freeBuffer() called for C++ Parcel %p\n", parcel); 15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcel->freeData(); 15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Parcel_init(JNIEnv* env, jobject clazz, jint parcelInt) 15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = (Parcel*)parcelInt; 15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int own = 0; 15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parcel) { 15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //LOGI("Initializing obj %p: creating new Parcel\n", clazz); 15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project own = 1; 15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcel = new Parcel; 15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //LOGI("Initializing obj %p: given existing Parcel %p\n", clazz, parcel); 15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel == NULL) { 15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/OutOfMemoryError", NULL); 15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //LOGI("Initializing obj %p from C++ Parcel %p, own=%d\n", clazz, parcel, own); 15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(clazz, gParcelOffsets.mOwnObject, own); 15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(clazz, gParcelOffsets.mObject, (int)parcel); 15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Parcel_destroy(JNIEnv* env, jobject clazz) 15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t own = env->GetIntField(clazz, gParcelOffsets.mOwnObject); 15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (own) { 15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(clazz, gParcelOffsets.mObject, 0); 15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //LOGI("Destroying obj %p: deleting C++ Parcel %p\n", clazz, parcel); 15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete parcel; 15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(clazz, gParcelOffsets.mObject, 0); 15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //LOGI("Destroying obj %p: leaving C++ Parcel %p\n", clazz); 15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jbyteArray android_os_Parcel_marshall(JNIEnv* env, jobject clazz) 15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel == NULL) { 15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // do not marshall if there are binder objects in the parcel 15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel->objectsCount()) 15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/RuntimeException", "Tried to marshall a Parcel that contained Binder objects."); 15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jbyteArray ret = env->NewByteArray(parcel->dataSize()); 15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ret != NULL) 15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jbyte* array = (jbyte*)env->GetPrimitiveArrayCritical(ret, 0); 15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (array != NULL) 15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memcpy(array, parcel->data(), parcel->dataSize()); 15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleasePrimitiveArrayCritical(ret, array, 0); 15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ret; 15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Parcel_unmarshall(JNIEnv* env, jobject clazz, jbyteArray data, jint offset, jint length) 15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel == NULL || length < 0) { 15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jbyte* array = (jbyte*)env->GetPrimitiveArrayCritical(data, 0); 15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (array) 15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcel->setDataSize(length); 15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcel->setDataPosition(0); 16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void* raw = parcel->writeInplace(length); 16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memcpy(raw, (array + offset), length); 16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleasePrimitiveArrayCritical(data, array, 0); 16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Parcel_appendFrom(JNIEnv* env, jobject clazz, jobject parcel, jint offset, jint length) 16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* thisParcel = parcelForJavaObject(env, clazz); 16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (thisParcel == NULL) { 16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* otherParcel = parcelForJavaObject(env, parcel); 16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (otherParcel == NULL) { 16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void) thisParcel->appendFrom(otherParcel, offset, length); 16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_os_Parcel_hasFileDescriptors(JNIEnv* env, jobject clazz) 16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jboolean ret = JNI_FALSE; 16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel != NULL) { 16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel->hasFileDescriptors()) { 16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ret = JNI_TRUE; 16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ret; 16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Parcel_writeInterfaceToken(JNIEnv* env, jobject clazz, jstring name) 16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel != NULL) { 16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // In the current implementation, the token is just the serialized interface name that 16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the caller expects to be invoking 16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const jchar* str = env->GetStringCritical(name, 0); 16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != NULL) { 16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcel->writeInterfaceToken(String16(str, env->GetStringLength(name))); 16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringCritical(name, str); 16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Parcel_enforceInterface(JNIEnv* env, jobject clazz, jstring name) 16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jboolean ret = JNI_FALSE; 16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel != NULL) { 16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const jchar* str = env->GetStringCritical(name, 0); 16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str) { 16567bcad8a315f12bd6251a998781efac7b11c2ca84Brad Fitzpatrick IPCThreadState* threadState = IPCThreadState::self(); 16577bcad8a315f12bd6251a998781efac7b11c2ca84Brad Fitzpatrick const int32_t oldPolicy = threadState->getStrictModePolicy(); 16587bcad8a315f12bd6251a998781efac7b11c2ca84Brad Fitzpatrick const bool isValid = parcel->enforceInterface( 1659727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick String16(str, env->GetStringLength(name)), 16607bcad8a315f12bd6251a998781efac7b11c2ca84Brad Fitzpatrick threadState); 16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringCritical(name, str); 16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isValid) { 16637bcad8a315f12bd6251a998781efac7b11c2ca84Brad Fitzpatrick const int32_t newPolicy = threadState->getStrictModePolicy(); 16647bcad8a315f12bd6251a998781efac7b11c2ca84Brad Fitzpatrick if (oldPolicy != newPolicy) { 1665727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick // Need to keep the Java-level thread-local strict 1666727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick // mode policy in sync for the libcore 1667727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick // enforcements, which involves an upcall back 1668727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick // into Java. (We can't modify the 1669727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick // Parcel.enforceInterface signature, as it's 1670727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick // pseudo-public, and used via AIDL 1671727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick // auto-generation...) 16727bcad8a315f12bd6251a998781efac7b11c2ca84Brad Fitzpatrick set_dalvik_blockguard_policy(env, newPolicy); 1673727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick } 16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; // everything was correct -> return silently 16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // all error conditions wind up here 16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/SecurityException", 16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Binder invocation to an incorrect interface"); 16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const JNINativeMethod gParcelMethods[] = { 16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"dataSize", "()I", (void*)android_os_Parcel_dataSize}, 16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"dataAvail", "()I", (void*)android_os_Parcel_dataAvail}, 16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"dataPosition", "()I", (void*)android_os_Parcel_dataPosition}, 16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"dataCapacity", "()I", (void*)android_os_Parcel_dataCapacity}, 16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"setDataSize", "(I)V", (void*)android_os_Parcel_setDataSize}, 16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"setDataPosition", "(I)V", (void*)android_os_Parcel_setDataPosition}, 16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"setDataCapacity", "(I)V", (void*)android_os_Parcel_setDataCapacity}, 16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"writeNative", "([BII)V", (void*)android_os_Parcel_writeNative}, 16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"writeInt", "(I)V", (void*)android_os_Parcel_writeInt}, 16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"writeLong", "(J)V", (void*)android_os_Parcel_writeLong}, 16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"writeFloat", "(F)V", (void*)android_os_Parcel_writeFloat}, 16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"writeDouble", "(D)V", (void*)android_os_Parcel_writeDouble}, 16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"writeString", "(Ljava/lang/String;)V", (void*)android_os_Parcel_writeString}, 17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"writeStrongBinder", "(Landroid/os/IBinder;)V", (void*)android_os_Parcel_writeStrongBinder}, 17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"writeFileDescriptor", "(Ljava/io/FileDescriptor;)V", (void*)android_os_Parcel_writeFileDescriptor}, 17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"createByteArray", "()[B", (void*)android_os_Parcel_createByteArray}, 17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"readInt", "()I", (void*)android_os_Parcel_readInt}, 17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"readLong", "()J", (void*)android_os_Parcel_readLong}, 17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"readFloat", "()F", (void*)android_os_Parcel_readFloat}, 17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"readDouble", "()D", (void*)android_os_Parcel_readDouble}, 17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"readString", "()Ljava/lang/String;", (void*)android_os_Parcel_readString}, 17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"readStrongBinder", "()Landroid/os/IBinder;", (void*)android_os_Parcel_readStrongBinder}, 17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"internalReadFileDescriptor", "()Ljava/io/FileDescriptor;", (void*)android_os_Parcel_readFileDescriptor}, 17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"openFileDescriptor", "(Ljava/lang/String;I)Ljava/io/FileDescriptor;", (void*)android_os_Parcel_openFileDescriptor}, 17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"closeFileDescriptor", "(Ljava/io/FileDescriptor;)V", (void*)android_os_Parcel_closeFileDescriptor}, 1712c9119f5034d36f548bbddd8f60291e24ab4e270bDianne Hackborn {"clearFileDescriptor", "(Ljava/io/FileDescriptor;)V", (void*)android_os_Parcel_clearFileDescriptor}, 17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"freeBuffer", "()V", (void*)android_os_Parcel_freeBuffer}, 17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"init", "(I)V", (void*)android_os_Parcel_init}, 17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"destroy", "()V", (void*)android_os_Parcel_destroy}, 17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"marshall", "()[B", (void*)android_os_Parcel_marshall}, 17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"unmarshall", "([BII)V", (void*)android_os_Parcel_unmarshall}, 17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"appendFrom", "(Landroid/os/Parcel;II)V", (void*)android_os_Parcel_appendFrom}, 17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"hasFileDescriptors", "()Z", (void*)android_os_Parcel_hasFileDescriptors}, 17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"writeInterfaceToken", "(Ljava/lang/String;)V", (void*)android_os_Parcel_writeInterfaceToken}, 17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"enforceInterface", "(Ljava/lang/String;)V", (void*)android_os_Parcel_enforceInterface}, 17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst char* const kParcelPathName = "android/os/Parcel"; 17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int int_register_android_os_Parcel(JNIEnv* env) 17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass clazz; 17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clazz = env->FindClass("android/util/Log"); 17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_FATAL_IF(clazz == NULL, "Unable to find class android.util.Log"); 17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gLogOffsets.mClass = (jclass) env->NewGlobalRef(clazz); 17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gLogOffsets.mLogE = env->GetStaticMethodID( 17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clazz, "e", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I"); 17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assert(gLogOffsets.mLogE); 17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clazz = env->FindClass("java/io/FileDescriptor"); 17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_FATAL_IF(clazz == NULL, "Unable to find class java.io.FileDescriptor"); 17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gFileDescriptorOffsets.mClass = (jclass) env->NewGlobalRef(clazz); 17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gFileDescriptorOffsets.mConstructor 17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = env->GetMethodID(clazz, "<init>", "()V"); 17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gFileDescriptorOffsets.mDescriptor = env->GetFieldID(clazz, "descriptor", "I"); 17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_FATAL_IF(gFileDescriptorOffsets.mDescriptor == NULL, 17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Unable to find descriptor field in java.io.FileDescriptor"); 17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clazz = env->FindClass("android/os/ParcelFileDescriptor"); 17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_FATAL_IF(clazz == NULL, "Unable to find class android.os.ParcelFileDescriptor"); 17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gParcelFileDescriptorOffsets.mClass = (jclass) env->NewGlobalRef(clazz); 17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gParcelFileDescriptorOffsets.mConstructor 17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = env->GetMethodID(clazz, "<init>", "(Ljava/io/FileDescriptor;)V"); 17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clazz = env->FindClass(kParcelPathName); 17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_FATAL_IF(clazz == NULL, "Unable to find class android.os.Parcel"); 17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gParcelOffsets.mObject 17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = env->GetFieldID(clazz, "mObject", "I"); 17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gParcelOffsets.mOwnObject 17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = env->GetFieldID(clazz, "mOwnObject", "I"); 17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1760727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick clazz = env->FindClass("android/os/StrictMode"); 1761727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick LOG_FATAL_IF(clazz == NULL, "Unable to find class android.os.StrictMode"); 1762727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick gStrictModeCallbackOffsets.mClass = (jclass) env->NewGlobalRef(clazz); 1763727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick gStrictModeCallbackOffsets.mCallback = env->GetStaticMethodID( 1764727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick clazz, "onBinderStrictModePolicyChange", "(I)V"); 1765727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick LOG_FATAL_IF(gStrictModeCallbackOffsets.mCallback == NULL, 1766727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick "Unable to find strict mode callback."); 1767727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick 17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AndroidRuntime::registerNativeMethods( 17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env, kParcelPathName, 17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gParcelMethods, NELEM(gParcelMethods)); 17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_os_Binder(JNIEnv* env) 17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (int_register_android_os_Binder(env) < 0) 17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (int_register_android_os_BinderInternal(env) < 0) 17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (int_register_android_os_BinderProxy(env) < 0) 17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (int_register_android_os_Parcel(env) < 0) 17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Returns the Unix file descriptor for a ParcelFileDescriptor object 17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint getParcelFileDescriptorFD(JNIEnv* env, jobject object) 17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return env->GetIntField(object, gFileDescriptorOffsets.mDescriptor); 17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1795