android_util_Binder.cpp revision 86284c60b52c40f027427aa32dbe8dc0899b63d5
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 4779dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate#define DEBUG_DEATH 0 4879dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate#if DEBUG_DEATH 4979dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate#define LOGDEATH LOGD 5079dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate#else 5179dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate#define LOGDEATH LOGV 5279dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate#endif 5379dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectusing namespace android; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct bindernative_offsets_t 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Class state. 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass mClass; 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jmethodID mExecTransact; 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Object state. 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID mObject; 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} gBinderOffsets; 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct binderinternal_offsets_t 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Class state. 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass mClass; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jmethodID mForceGc; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} gBinderInternalOffsets; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct debug_offsets_t 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Class state. 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass mClass; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} gDebugOffsets; 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct weakreference_offsets_t 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Class state. 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass mClass; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jmethodID mGet; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} gWeakReferenceOffsets; 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct error_offsets_t 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass mClass; 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} gErrorOffsets; 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct binderproxy_offsets_t 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Class state. 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass mClass; 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jmethodID mConstructor; 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jmethodID mSendDeathNotice; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Object state. 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID mObject; 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID mSelf; 115bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate jfieldID mOrgue; 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} gBinderProxyOffsets; 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct parcel_offsets_t 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID mObject; 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID mOwnObject; 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} gParcelOffsets; 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct log_offsets_t 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Class state. 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass mClass; 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jmethodID mLogE; 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} gLogOffsets; 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 2859013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert if (excep) { 2869013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert report_exception(env, excep, 2879013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert "*** Uncaught remote exception! " 2889013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert "(Exceptions are not yet supported across processes.)"); 2899013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert res = JNI_FALSE; 2909013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert 2919013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert /* clean up JNI local ref -- we don't return to Java code */ 2929013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert env->DeleteLocalRef(excep); 2939013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert } 2949013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert 295727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick // Restore the Java binder thread's state if it changed while 296727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick // processing a call (as it would if the Parcel's header had a 297727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick // new policy mask and Parcel.enforceInterface() changed 298727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick // it...) 299727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick const int strict_policy_after = thread_state->getStrictModePolicy(); 300727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick if (strict_policy_after != strict_policy_before) { 301727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick // Our thread-local... 302727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick thread_state->setStrictModePolicy(strict_policy_before); 303727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick // And the Java-level thread-local... 304727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick set_dalvik_blockguard_policy(env, strict_policy_before); 305727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick } 306727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick 3079013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert jthrowable excep2 = env->ExceptionOccurred(); 3089013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert if (excep2) { 3099013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert report_exception(env, excep2, 3109013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert "*** Uncaught exception in onBinderStrictModePolicyChange"); 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* clean up JNI local ref -- we don't return to Java code */ 3129013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert env->DeleteLocalRef(excep2); 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //aout << "onTransact to Java code; result=" << res << endl 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // << "Transact from " << this << " to Java code returning " 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // << reply << ": " << *reply << endl; 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res != JNI_FALSE ? NO_ERROR : UNKNOWN_TRANSACTION; 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t dump(int fd, const Vector<String16>& args) 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JavaVM* const mVM; 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject const mObject; 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass JavaBBinderHolder : public RefBase 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 3360b41448506610f73302cc631677823fd8b865ea5Christopher Tate sp<JavaBBinder> get(JNIEnv* env, jobject obj) 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AutoMutex _l(mLock); 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<JavaBBinder> b = mBinder.promote(); 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (b == NULL) { 3410b41448506610f73302cc631677823fd8b865ea5Christopher Tate b = new JavaBBinder(env, obj); 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBinder = b; 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("Creating JavaBinder %p (refs %p) for Object %p, weakCount=%d\n", 3440b41448506610f73302cc631677823fd8b865ea5Christopher Tate b.get(), b->getWeakRefs(), obj, b->getWeakRefs()->getWeakCount()); 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return b; 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<JavaBBinder> getExisting() 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AutoMutex _l(mLock); 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBinder.promote(); 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex mLock; 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wp<JavaBBinder> mBinder; 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3630b41448506610f73302cc631677823fd8b865ea5Christopher Tate// Per-IBinder death recipient bookkeeping. This is how we reconcile local jobject 3640b41448506610f73302cc631677823fd8b865ea5Christopher Tate// death recipient references passed in through JNI with the permanent corresponding 3650b41448506610f73302cc631677823fd8b865ea5Christopher Tate// JavaDeathRecipient objects. 3660b41448506610f73302cc631677823fd8b865ea5Christopher Tate 3670b41448506610f73302cc631677823fd8b865ea5Christopher Tateclass JavaDeathRecipient; 3680b41448506610f73302cc631677823fd8b865ea5Christopher Tate 3690b41448506610f73302cc631677823fd8b865ea5Christopher Tateclass DeathRecipientList : public RefBase { 3700b41448506610f73302cc631677823fd8b865ea5Christopher Tate List< sp<JavaDeathRecipient> > mList; 3710b41448506610f73302cc631677823fd8b865ea5Christopher Tate Mutex mLock; 3720b41448506610f73302cc631677823fd8b865ea5Christopher Tate 3730b41448506610f73302cc631677823fd8b865ea5Christopher Tatepublic: 37479dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate DeathRecipientList(); 3750b41448506610f73302cc631677823fd8b865ea5Christopher Tate ~DeathRecipientList(); 3760b41448506610f73302cc631677823fd8b865ea5Christopher Tate 3770b41448506610f73302cc631677823fd8b865ea5Christopher Tate void add(const sp<JavaDeathRecipient>& recipient); 3780b41448506610f73302cc631677823fd8b865ea5Christopher Tate void remove(const sp<JavaDeathRecipient>& recipient); 3790b41448506610f73302cc631677823fd8b865ea5Christopher Tate sp<JavaDeathRecipient> find(jobject recipient); 3800b41448506610f73302cc631677823fd8b865ea5Christopher Tate}; 3810b41448506610f73302cc631677823fd8b865ea5Christopher Tate 3820b41448506610f73302cc631677823fd8b865ea5Christopher Tate// ---------------------------------------------------------------------------- 3830b41448506610f73302cc631677823fd8b865ea5Christopher Tate 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass JavaDeathRecipient : public IBinder::DeathRecipient 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 387bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate JavaDeathRecipient(JNIEnv* env, jobject object, const sp<DeathRecipientList>& list) 38886284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate : mVM(jnienv_to_javavm(env)), mObject(env->NewGlobalRef(object)), 38986284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate mObjectWeak(NULL), mList(list) 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3910b41448506610f73302cc631677823fd8b865ea5Christopher Tate // These objects manage their own lifetimes so are responsible for final bookkeeping. 3920b41448506610f73302cc631677823fd8b865ea5Christopher Tate // The list holds a strong reference to this object. 39379dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate LOGDEATH("Adding JDR %p to DRL %p", this, list.get()); 394bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate list->add(this); 3950b41448506610f73302cc631677823fd8b865ea5Christopher Tate 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android_atomic_inc(&gNumDeathRefs); 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project incRefsCreated(env); 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void binderDied(const wp<IBinder>& who) 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 40279dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate LOGDEATH("Receiving binderDied() on JavaDeathRecipient %p\n", this); 40386284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate if (mObject != NULL) { 40486284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate JNIEnv* env = javavm_to_jnienv(mVM); 40586284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate 40686284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate env->CallStaticVoidMethod(gBinderProxyOffsets.mClass, 40786284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate gBinderProxyOffsets.mSendDeathNotice, mObject); 40886284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate jthrowable excep = env->ExceptionOccurred(); 40986284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate if (excep) { 41086284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate report_exception(env, excep, 41186284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate "*** Uncaught exception returned from death notification!"); 41286284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate } 41386284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate 41486284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate // Demote from strong ref to weak after binderDied() has been delivered, 41586284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate // to allow the DeathRecipient and BinderProxy to be GC'd if no longer needed. 41686284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate mObjectWeak = env->NewWeakGlobalRef(mObject); 41786284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate env->DeleteGlobalRef(mObject); 41886284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate mObject = NULL; 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void clearReference() 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 424bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate sp<DeathRecipientList> list = mList.promote(); 425bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate if (list != NULL) { 42679dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate LOGDEATH("Removing JDR %p from DRL %p", this, list.get()); 427bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate list->remove(this); 42879dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate } else { 42979dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate LOGDEATH("clearReference() on JDR %p but DRL wp purged", this); 430bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate } 4310b41448506610f73302cc631677823fd8b865ea5Christopher Tate } 4320b41448506610f73302cc631677823fd8b865ea5Christopher Tate 4330b41448506610f73302cc631677823fd8b865ea5Christopher Tate bool matches(jobject obj) { 43486284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate bool result; 4350b41448506610f73302cc631677823fd8b865ea5Christopher Tate JNIEnv* env = javavm_to_jnienv(mVM); 43686284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate 43786284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate if (mObject != NULL) { 43886284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate result = env->IsSameObject(obj, mObject); 43986284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate } else { 44086284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate jobject me = env->NewLocalRef(mObjectWeak); 44186284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate result = env->IsSameObject(obj, me); 44286284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate env->DeleteLocalRef(me); 44386284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate } 44486284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate return result; 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprotected: 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual ~JavaDeathRecipient() 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //LOGI("Removing death ref: recipient=%p\n", mObject); 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android_atomic_dec(&gNumDeathRefs); 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv* env = javavm_to_jnienv(mVM); 45386284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate if (mObject != NULL) { 45486284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate env->DeleteGlobalRef(mObject); 45586284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate } else { 45686284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate env->DeleteWeakGlobalRef(mObjectWeak); 45786284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate } 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 46186284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate JavaVM* const mVM; 46286284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate jobject mObject; 46386284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate jweak mObjectWeak; // will be a weak ref to the same VM-side DeathRecipient after binderDied() 464bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate wp<DeathRecipientList> mList; 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 46979dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher TateDeathRecipientList::DeathRecipientList() { 47079dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate LOGDEATH("New DRL @ %p", this); 47179dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate} 47279dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate 4730b41448506610f73302cc631677823fd8b865ea5Christopher TateDeathRecipientList::~DeathRecipientList() { 47479dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate LOGDEATH("Destroy DRL @ %p", this); 4750b41448506610f73302cc631677823fd8b865ea5Christopher Tate AutoMutex _l(mLock); 4760b41448506610f73302cc631677823fd8b865ea5Christopher Tate 4770b41448506610f73302cc631677823fd8b865ea5Christopher Tate // Should never happen -- the JavaDeathRecipient objects that have added themselves 4780b41448506610f73302cc631677823fd8b865ea5Christopher Tate // to the list are holding references on the list object. Only when they are torn 4790b41448506610f73302cc631677823fd8b865ea5Christopher Tate // down can the list header be destroyed. 4800b41448506610f73302cc631677823fd8b865ea5Christopher Tate if (mList.size() > 0) { 481bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate LOGE("Retiring DRL %p with extant death recipients\n", this); 4820b41448506610f73302cc631677823fd8b865ea5Christopher Tate } 4830b41448506610f73302cc631677823fd8b865ea5Christopher Tate} 4840b41448506610f73302cc631677823fd8b865ea5Christopher Tate 4850b41448506610f73302cc631677823fd8b865ea5Christopher Tatevoid DeathRecipientList::add(const sp<JavaDeathRecipient>& recipient) { 4860b41448506610f73302cc631677823fd8b865ea5Christopher Tate AutoMutex _l(mLock); 4870b41448506610f73302cc631677823fd8b865ea5Christopher Tate 48879dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate LOGDEATH("DRL @ %p : add JDR %p", this, recipient.get()); 4890b41448506610f73302cc631677823fd8b865ea5Christopher Tate mList.push_back(recipient); 4900b41448506610f73302cc631677823fd8b865ea5Christopher Tate} 4910b41448506610f73302cc631677823fd8b865ea5Christopher Tate 4920b41448506610f73302cc631677823fd8b865ea5Christopher Tatevoid DeathRecipientList::remove(const sp<JavaDeathRecipient>& recipient) { 4930b41448506610f73302cc631677823fd8b865ea5Christopher Tate AutoMutex _l(mLock); 4940b41448506610f73302cc631677823fd8b865ea5Christopher Tate 4950b41448506610f73302cc631677823fd8b865ea5Christopher Tate List< sp<JavaDeathRecipient> >::iterator iter; 4960b41448506610f73302cc631677823fd8b865ea5Christopher Tate for (iter = mList.begin(); iter != mList.end(); iter++) { 4970b41448506610f73302cc631677823fd8b865ea5Christopher Tate if (*iter == recipient) { 49879dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate LOGDEATH("DRL @ %p : remove JDR %p", this, recipient.get()); 4990b41448506610f73302cc631677823fd8b865ea5Christopher Tate mList.erase(iter); 5000b41448506610f73302cc631677823fd8b865ea5Christopher Tate return; 5010b41448506610f73302cc631677823fd8b865ea5Christopher Tate } 5020b41448506610f73302cc631677823fd8b865ea5Christopher Tate } 5030b41448506610f73302cc631677823fd8b865ea5Christopher Tate} 5040b41448506610f73302cc631677823fd8b865ea5Christopher Tate 5050b41448506610f73302cc631677823fd8b865ea5Christopher Tatesp<JavaDeathRecipient> DeathRecipientList::find(jobject recipient) { 5060b41448506610f73302cc631677823fd8b865ea5Christopher Tate AutoMutex _l(mLock); 5070b41448506610f73302cc631677823fd8b865ea5Christopher Tate 5080b41448506610f73302cc631677823fd8b865ea5Christopher Tate List< sp<JavaDeathRecipient> >::iterator iter; 5090b41448506610f73302cc631677823fd8b865ea5Christopher Tate for (iter = mList.begin(); iter != mList.end(); iter++) { 5100b41448506610f73302cc631677823fd8b865ea5Christopher Tate if ((*iter)->matches(recipient)) { 5110b41448506610f73302cc631677823fd8b865ea5Christopher Tate return *iter; 5120b41448506610f73302cc631677823fd8b865ea5Christopher Tate } 5130b41448506610f73302cc631677823fd8b865ea5Christopher Tate } 5140b41448506610f73302cc631677823fd8b865ea5Christopher Tate return NULL; 5150b41448506610f73302cc631677823fd8b865ea5Christopher Tate} 5160b41448506610f73302cc631677823fd8b865ea5Christopher Tate 5170b41448506610f73302cc631677823fd8b865ea5Christopher Tate// ---------------------------------------------------------------------------- 5180b41448506610f73302cc631677823fd8b865ea5Christopher Tate 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void proxy_cleanup(const void* id, void* obj, void* cleanupCookie) 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android_atomic_dec(&gNumProxyRefs); 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv* env = javavm_to_jnienv((JavaVM*)cleanupCookie); 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->DeleteGlobalRef((jobject)obj); 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic Mutex mProxyLock; 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjobject javaObjectForIBinder(JNIEnv* env, const sp<IBinder>& val) 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val == NULL) return NULL; 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val->checkSubclass(&gBinderOffsets)) { 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // One of our own! 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject object = static_cast<JavaBBinder*>(val.get())->object(); 53786284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate LOGDEATH("objectForBinder %p: it's our own %p!\n", val.get(), object); 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return object; 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // For the rest of the function we will hold this lock, to serialize 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // looking/creation of Java proxies for native Binder proxies. 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AutoMutex _l(mProxyLock); 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Someone else's... do we know about it? 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject object = (jobject)val->findObject(&gBinderProxyOffsets); 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (object != NULL) { 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject res = env->CallObjectMethod(object, gWeakReferenceOffsets.mGet); 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != NULL) { 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("objectForBinder %p: found existing %p!\n", val.get(), res); 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 55386284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate LOGDEATH("Proxy object %p of IBinder %p no longer in working set!!!", object, val.get()); 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android_atomic_dec(&gNumProxyRefs); 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val->detachObject(&gBinderProxyOffsets); 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->DeleteGlobalRef(object); 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project object = env->NewObject(gBinderProxyOffsets.mClass, gBinderProxyOffsets.mConstructor); 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (object != NULL) { 56179dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate LOGDEATH("objectForBinder %p: created new proxy %p !\n", val.get(), object); 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The proxy holds a reference to the native object. 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(object, gBinderProxyOffsets.mObject, (int)val.get()); 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val->incStrong(object); 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The native object needs to hold a weak reference back to the 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // proxy, so we can retrieve the same proxy if it is still active. 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject refObject = env->NewGlobalRef( 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->GetObjectField(object, gBinderProxyOffsets.mSelf)); 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val->attachObject(&gBinderProxyOffsets, refObject, 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jnienv_to_javavm(env), proxy_cleanup); 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 573bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate // Also remember the death recipients registered on this proxy 574bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate sp<DeathRecipientList> drl = new DeathRecipientList; 575bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate drl->incStrong((void*)javaObjectForIBinder); 576bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate env->SetIntField(object, gBinderProxyOffsets.mOrgue, reinterpret_cast<jint>(drl.get())); 577bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Note that a new object reference has been created. 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android_atomic_inc(&gNumProxyRefs); 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project incRefsCreated(env); 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return object; 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<IBinder> ibinderForJavaObject(JNIEnv* env, jobject obj) 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (obj == NULL) return NULL; 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (env->IsInstanceOf(obj, gBinderOffsets.mClass)) { 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JavaBBinderHolder* jbh = (JavaBBinderHolder*) 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->GetIntField(obj, gBinderOffsets.mObject); 5930b41448506610f73302cc631677823fd8b865ea5Christopher Tate return jbh != NULL ? jbh->get(env, obj) : NULL; 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (env->IsInstanceOf(obj, gBinderProxyOffsets.mClass)) { 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (IBinder*) 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->GetIntField(obj, gBinderProxyOffsets.mObject); 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGW("ibinderForJavaObject: %p is not a Binder object", obj); 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectParcel* parcelForJavaObject(JNIEnv* env, jobject obj) 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (obj) { 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* p = (Parcel*)env->GetIntField(obj, gParcelOffsets.mObject); 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p != NULL) { 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p; 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", "Parcel has been finalized!"); 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjobject newParcelFileDescriptor(JNIEnv* env, jobject fileDesc) 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return env->NewObject( 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gParcelFileDescriptorOffsets.mClass, gParcelFileDescriptorOffsets.mConstructor, fileDesc); 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid signalExceptionForError(JNIEnv* env, jobject obj, status_t err) 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (err) { 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case UNKNOWN_ERROR: 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/RuntimeException", "Unknown error"); 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case NO_MEMORY: 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/OutOfMemoryError", NULL); 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case INVALID_OPERATION: 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/UnsupportedOperationException", NULL); 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BAD_VALUE: 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BAD_INDEX: 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IndexOutOfBoundsException", NULL); 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BAD_TYPE: 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case NAME_NOT_FOUND: 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/util/NoSuchElementException", NULL); 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PERMISSION_DENIED: 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/SecurityException", NULL); 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case NOT_ENOUGH_DATA: 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "android/os/ParcelFormatException", "Not enough data"); 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case NO_INIT: 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/RuntimeException", "Not initialized"); 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case ALREADY_EXISTS: 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/RuntimeException", "Item already exists"); 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DEAD_OBJECT: 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "android/os/DeadObjectException", NULL); 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case UNKNOWN_TRANSACTION: 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/RuntimeException", "Unknown transaction code"); 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case FAILED_TRANSACTION: 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("!!! FAILED BINDER TRANSACTION !!!"); 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //jniThrowException(env, "java/lang/OutOfMemoryError", "Binder transaction too large"); 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("Unknown binder error code. 0x%x", err); 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_os_Binder_getCallingPid(JNIEnv* env, jobject clazz) 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return IPCThreadState::self()->getCallingPid(); 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_os_Binder_getCallingUid(JNIEnv* env, jobject clazz) 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return IPCThreadState::self()->getCallingUid(); 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jlong android_os_Binder_clearCallingIdentity(JNIEnv* env, jobject clazz) 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return IPCThreadState::self()->clearCallingIdentity(); 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Binder_restoreCallingIdentity(JNIEnv* env, jobject clazz, jlong token) 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 695cf3004a46eabb49f3eee483067e75aef7b0a69e7Dianne Hackborn // XXX temporary sanity check to debug crashes. 696cf3004a46eabb49f3eee483067e75aef7b0a69e7Dianne Hackborn int uid = (int)(token>>32); 697cf3004a46eabb49f3eee483067e75aef7b0a69e7Dianne Hackborn if (uid > 0 && uid < 999) { 698cf3004a46eabb49f3eee483067e75aef7b0a69e7Dianne Hackborn // In Android currently there are no uids in this range. 699cf3004a46eabb49f3eee483067e75aef7b0a69e7Dianne Hackborn char buf[128]; 700cf3004a46eabb49f3eee483067e75aef7b0a69e7Dianne Hackborn sprintf(buf, "Restoring bad calling ident: 0x%Lx", token); 701cf3004a46eabb49f3eee483067e75aef7b0a69e7Dianne Hackborn jniThrowException(env, "java/lang/IllegalStateException", buf); 702cf3004a46eabb49f3eee483067e75aef7b0a69e7Dianne Hackborn return; 703cf3004a46eabb49f3eee483067e75aef7b0a69e7Dianne Hackborn } 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IPCThreadState::self()->restoreCallingIdentity(token); 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 707727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrickstatic void android_os_Binder_setThreadStrictModePolicy(JNIEnv* env, jobject clazz, jint policyMask) 708727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick{ 709727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick IPCThreadState::self()->setStrictModePolicy(policyMask); 710727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick} 711727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick 712727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrickstatic jint android_os_Binder_getThreadStrictModePolicy(JNIEnv* env, jobject clazz) 713727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick{ 714727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick return IPCThreadState::self()->getStrictModePolicy(); 715727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick} 716727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Binder_flushPendingCommands(JNIEnv* env, jobject clazz) 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IPCThreadState::self()->flushCommands(); 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7220b41448506610f73302cc631677823fd8b865ea5Christopher Tatestatic void android_os_Binder_init(JNIEnv* env, jobject obj) 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7240b41448506610f73302cc631677823fd8b865ea5Christopher Tate JavaBBinderHolder* jbh = new JavaBBinderHolder(); 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (jbh == NULL) { 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/OutOfMemoryError", NULL); 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7290b41448506610f73302cc631677823fd8b865ea5Christopher Tate LOGV("Java Binder %p: acquiring first ref on holder %p", obj, jbh); 7300b41448506610f73302cc631677823fd8b865ea5Christopher Tate jbh->incStrong((void*)android_os_Binder_init); 7310b41448506610f73302cc631677823fd8b865ea5Christopher Tate env->SetIntField(obj, gBinderOffsets.mObject, (int)jbh); 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7340b41448506610f73302cc631677823fd8b865ea5Christopher Tatestatic void android_os_Binder_destroy(JNIEnv* env, jobject obj) 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JavaBBinderHolder* jbh = (JavaBBinderHolder*) 7370b41448506610f73302cc631677823fd8b865ea5Christopher Tate env->GetIntField(obj, gBinderOffsets.mObject); 738582763ae4e2910b4059dccdfd30a447e9fc974d5Jeff Brown if (jbh != NULL) { 7390b41448506610f73302cc631677823fd8b865ea5Christopher Tate env->SetIntField(obj, gBinderOffsets.mObject, 0); 7400b41448506610f73302cc631677823fd8b865ea5Christopher Tate LOGV("Java Binder %p: removing ref on holder %p", obj, jbh); 7410b41448506610f73302cc631677823fd8b865ea5Christopher Tate jbh->decStrong((void*)android_os_Binder_init); 742582763ae4e2910b4059dccdfd30a447e9fc974d5Jeff Brown } else { 743582763ae4e2910b4059dccdfd30a447e9fc974d5Jeff Brown // Encountering an uninitialized binder is harmless. All it means is that 744582763ae4e2910b4059dccdfd30a447e9fc974d5Jeff Brown // the Binder was only partially initialized when its finalizer ran and called 745582763ae4e2910b4059dccdfd30a447e9fc974d5Jeff Brown // destroy(). The Binder could be partially initialized for several reasons. 746582763ae4e2910b4059dccdfd30a447e9fc974d5Jeff Brown // For example, a Binder subclass constructor might have thrown an exception before 747582763ae4e2910b4059dccdfd30a447e9fc974d5Jeff Brown // it could delegate to its superclass's constructor. Consequently init() would 748582763ae4e2910b4059dccdfd30a447e9fc974d5Jeff Brown // not have been called and the holder pointer would remain NULL. 7490b41448506610f73302cc631677823fd8b865ea5Christopher Tate LOGV("Java Binder %p: ignoring uninitialized binder", obj); 750582763ae4e2910b4059dccdfd30a447e9fc974d5Jeff Brown } 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const JNINativeMethod gBinderMethods[] = { 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* name, signature, funcPtr */ 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "getCallingPid", "()I", (void*)android_os_Binder_getCallingPid }, 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "getCallingUid", "()I", (void*)android_os_Binder_getCallingUid }, 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "clearCallingIdentity", "()J", (void*)android_os_Binder_clearCallingIdentity }, 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "restoreCallingIdentity", "(J)V", (void*)android_os_Binder_restoreCallingIdentity }, 761727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick { "setThreadStrictModePolicy", "(I)V", (void*)android_os_Binder_setThreadStrictModePolicy }, 762727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick { "getThreadStrictModePolicy", "()I", (void*)android_os_Binder_getThreadStrictModePolicy }, 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "flushPendingCommands", "()V", (void*)android_os_Binder_flushPendingCommands }, 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "init", "()V", (void*)android_os_Binder_init }, 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "destroy", "()V", (void*)android_os_Binder_destroy } 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst char* const kBinderPathName = "android/os/Binder"; 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int int_register_android_os_Binder(JNIEnv* env) 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass clazz; 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clazz = env->FindClass(kBinderPathName); 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_FATAL_IF(clazz == NULL, "Unable to find class android.os.Binder"); 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderOffsets.mClass = (jclass) env->NewGlobalRef(clazz); 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderOffsets.mExecTransact 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = env->GetMethodID(clazz, "execTransact", "(IIII)Z"); 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assert(gBinderOffsets.mExecTransact); 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderOffsets.mObject 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = env->GetFieldID(clazz, "mObject", "I"); 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assert(gBinderOffsets.mObject); 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AndroidRuntime::registerNativeMethods( 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env, kBinderPathName, 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderMethods, NELEM(gBinderMethods)); 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjint android_os_Debug_getLocalObjectCount(JNIEnv* env, jobject clazz) 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return gNumLocalRefs; 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjint android_os_Debug_getProxyObjectCount(JNIEnv* env, jobject clazz) 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return gNumProxyRefs; 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjint android_os_Debug_getDeathObjectCount(JNIEnv* env, jobject clazz) 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return gNumDeathRefs; 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jobject android_os_BinderInternal_getContextObject(JNIEnv* env, jobject clazz) 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IBinder> b = ProcessState::self()->getContextObject(NULL); 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return javaObjectForIBinder(env, b); 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_BinderInternal_joinThreadPool(JNIEnv* env, jobject clazz) 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IBinder> b = ProcessState::self()->getContextObject(NULL); 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android::IPCThreadState::self()->joinThreadPool(); 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 830887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackbornstatic void android_os_BinderInternal_disableBackgroundScheduling(JNIEnv* env, 831887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn jobject clazz, jboolean disable) 832887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn{ 833887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn IPCThreadState::disableBackgroundScheduling(disable ? true : false); 834887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn} 835887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_BinderInternal_handleGc(JNIEnv* env, jobject clazz) 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("Gc has executed, clearing binder ops"); 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android_atomic_and(0, &gNumRefsCreated); 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const JNINativeMethod gBinderInternalMethods[] = { 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* name, signature, funcPtr */ 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "getContextObject", "()Landroid/os/IBinder;", (void*)android_os_BinderInternal_getContextObject }, 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "joinThreadPool", "()V", (void*)android_os_BinderInternal_joinThreadPool }, 848887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn { "disableBackgroundScheduling", "(Z)V", (void*)android_os_BinderInternal_disableBackgroundScheduling }, 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "handleGc", "()V", (void*)android_os_BinderInternal_handleGc } 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst char* const kBinderInternalPathName = "com/android/internal/os/BinderInternal"; 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int int_register_android_os_BinderInternal(JNIEnv* env) 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass clazz; 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clazz = env->FindClass(kBinderInternalPathName); 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_FATAL_IF(clazz == NULL, "Unable to find class com.android.internal.os.BinderInternal"); 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderInternalOffsets.mClass = (jclass) env->NewGlobalRef(clazz); 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderInternalOffsets.mForceGc 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = env->GetStaticMethodID(clazz, "forceBinderGc", "()V"); 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assert(gBinderInternalOffsets.mForceGc); 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AndroidRuntime::registerNativeMethods( 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env, kBinderInternalPathName, 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderInternalMethods, NELEM(gBinderInternalMethods)); 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_os_BinderProxy_pingBinder(JNIEnv* env, jobject obj) 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder* target = (IBinder*) 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->GetIntField(obj, gBinderProxyOffsets.mObject); 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (target == NULL) { 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = target->pingBinder(); 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err == NO_ERROR ? JNI_TRUE : JNI_FALSE; 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jstring android_os_BinderProxy_getInterfaceDescriptor(JNIEnv* env, jobject obj) 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder* target = (IBinder*) env->GetIntField(obj, gBinderProxyOffsets.mObject); 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (target != NULL) { 8902c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick const String16& desc = target->getInterfaceDescriptor(); 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return env->NewString(desc.string(), desc.size()); 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/RuntimeException", 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "No binder found for object"); 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_os_BinderProxy_isBinderAlive(JNIEnv* env, jobject obj) 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder* target = (IBinder*) 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->GetIntField(obj, gBinderProxyOffsets.mObject); 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (target == NULL) { 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool alive = target->isBinderAlive(); 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return alive ? JNI_TRUE : JNI_FALSE; 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9092c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrickstatic int getprocname(pid_t pid, char *buf, size_t len) { 9102c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick char filename[20]; 9112c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick FILE *f; 9122c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick 9132c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick sprintf(filename, "/proc/%d/cmdline", pid); 9142c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick f = fopen(filename, "r"); 9152c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick if (!f) { *buf = '\0'; return 1; } 9162c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick if (!fgets(buf, len, f)) { *buf = '\0'; return 2; } 9172c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick fclose(f); 9182c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick return 0; 9192c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick} 9202c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick 9212c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrickstatic bool push_eventlog_string(char** pos, const char* end, const char* str) { 9222c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick jint len = strlen(str); 9232c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick int space_needed = 1 + sizeof(len) + len; 9242c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick if (end - *pos < space_needed) { 9252c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick LOGW("not enough space for string. remain=%d; needed=%d", 9262c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick (end - *pos), space_needed); 9272c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick return false; 9282c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick } 9292c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick **pos = EVENT_TYPE_STRING; 9302c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick (*pos)++; 9312c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick memcpy(*pos, &len, sizeof(len)); 9322c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick *pos += sizeof(len); 9332c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick memcpy(*pos, str, len); 9342c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick *pos += len; 9352c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick return true; 9362c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick} 9372c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick 9382c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrickstatic bool push_eventlog_int(char** pos, const char* end, jint val) { 9392c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick int space_needed = 1 + sizeof(val); 9402c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick if (end - *pos < space_needed) { 9412c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick LOGW("not enough space for int. remain=%d; needed=%d", 9422c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick (end - *pos), space_needed); 9432c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick return false; 9442c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick } 9452c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick **pos = EVENT_TYPE_INT; 9462c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick (*pos)++; 9472c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick memcpy(*pos, &val, sizeof(val)); 9482c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick *pos += sizeof(val); 9492c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick return true; 9502c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick} 9512c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick 9522c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick// From frameworks/base/core/java/android/content/EventLogTags.logtags: 9532c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick#define LOGTAG_BINDER_OPERATION 52004 9542c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick 9552c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrickstatic void conditionally_log_binder_call(int64_t start_millis, 9562c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick IBinder* target, jint code) { 9572c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick int duration_ms = static_cast<int>(uptimeMillis() - start_millis); 9582c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick 9592c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick int sample_percent; 9602c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick if (duration_ms >= 500) { 9612c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick sample_percent = 100; 9622c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick } else { 9632c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick sample_percent = 100 * duration_ms / 500; 9642c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick if (sample_percent == 0) { 9652c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick return; 9662c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick } 9672c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick if (sample_percent < (random() % 100 + 1)) { 9682c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick return; 9692c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick } 9702c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick } 9712c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick 9722c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick char process_name[40]; 9732c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick getprocname(getpid(), process_name, sizeof(process_name)); 9742c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick String8 desc(target->getInterfaceDescriptor()); 9752c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick 9762c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick char buf[LOGGER_ENTRY_MAX_PAYLOAD]; 9772c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick buf[0] = EVENT_TYPE_LIST; 9782c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick buf[1] = 5; 9792c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick char* pos = &buf[2]; 9802c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick char* end = &buf[LOGGER_ENTRY_MAX_PAYLOAD - 1]; // leave room for final \n 9812c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick if (!push_eventlog_string(&pos, end, desc.string())) return; 9822c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick if (!push_eventlog_int(&pos, end, code)) return; 9832c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick if (!push_eventlog_int(&pos, end, duration_ms)) return; 9842c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick if (!push_eventlog_string(&pos, end, process_name)) return; 9852c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick if (!push_eventlog_int(&pos, end, sample_percent)) return; 9862c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick *(pos++) = '\n'; // conventional with EVENT_TYPE_LIST apparently. 9872c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick android_bWriteLog(LOGTAG_BINDER_OPERATION, buf, pos - buf); 9882c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick} 9892c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick 990ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick// We only measure binder call durations to potentially log them if 991ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick// we're on the main thread. Unfortunately sim-eng doesn't seem to 992ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick// have gettid, so we just ignore this and don't log if we can't 993ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick// get the thread id. 994ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrickstatic bool should_time_binder_calls() { 9955348c014129b766d621ef82a6e42007009ffc310Brad Fitzpatrick#ifdef HAVE_GETTID 9965348c014129b766d621ef82a6e42007009ffc310Brad Fitzpatrick return (getpid() == androidGetTid()); 997ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick#else 998ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick#warning no gettid(), so not logging Binder calls... 999ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick return false; 1000ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick#endif 1001ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick} 1002ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_os_BinderProxy_transact(JNIEnv* env, jobject obj, 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint code, jobject dataObj, 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject replyObj, jint flags) 10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dataObj == NULL) { 100869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes jniThrowNullPointerException(env, NULL); 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* data = parcelForJavaObject(env, dataObj); 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (data == NULL) { 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* reply = parcelForJavaObject(env, replyObj); 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (reply == NULL && replyObj != NULL) { 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder* target = (IBinder*) 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->GetIntField(obj, gBinderProxyOffsets.mObject); 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (target == NULL) { 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", "Binder has been finalized!"); 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("Java code calling transact on %p in Java object %p with code %d\n", 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project target, obj, code); 10302c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick 10312c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick // Only log the binder call duration for things on the Java-level main thread. 1032ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick // But if we don't 1033ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick const bool time_binder_calls = should_time_binder_calls(); 1034ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick 10352c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick int64_t start_millis; 1036ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick if (time_binder_calls) { 10372c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick start_millis = uptimeMillis(); 10382c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick } 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("Transact from Java code to %p sending: ", target); data->print(); 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = target->transact(code, *data, reply, flags); 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //if (reply) printf("Transact from Java code to %p received: ", target); reply->print(); 1042ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick if (time_binder_calls) { 10432c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick conditionally_log_binder_call(start_millis, target, code); 10442c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick } 10452c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err == NO_ERROR) { 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_TRUE; 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (err == UNKNOWN_TRANSACTION) { 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project signalExceptionForError(env, obj, err); 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_BinderProxy_linkToDeath(JNIEnv* env, jobject obj, 10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject recipient, jint flags) 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (recipient == NULL) { 106069a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes jniThrowNullPointerException(env, NULL); 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder* target = (IBinder*) 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->GetIntField(obj, gBinderProxyOffsets.mObject); 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (target == NULL) { 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGW("Binder has been finalized when calling linkToDeath() with recip=%p)\n", recipient); 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assert(false); 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 107179dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate LOGDEATH("linkToDeath: binder=%p recipient=%p\n", target, recipient); 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!target->localBinder()) { 1074bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate DeathRecipientList* list = (DeathRecipientList*) 1075bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate env->GetIntField(obj, gBinderProxyOffsets.mOrgue); 1076bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate sp<JavaDeathRecipient> jdr = new JavaDeathRecipient(env, recipient, list); 10770b41448506610f73302cc631677823fd8b865ea5Christopher Tate status_t err = target->linkToDeath(jdr, NULL, flags); 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Failure adding the death recipient, so clear its reference 10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // now. 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jdr->clearReference(); 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project signalExceptionForError(env, obj, err); 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_os_BinderProxy_unlinkToDeath(JNIEnv* env, jobject obj, 10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject recipient, jint flags) 10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jboolean res = JNI_FALSE; 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (recipient == NULL) { 109269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes jniThrowNullPointerException(env, NULL); 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder* target = (IBinder*) 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->GetIntField(obj, gBinderProxyOffsets.mObject); 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (target == NULL) { 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGW("Binder has been finalized when calling linkToDeath() with recip=%p)\n", recipient); 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 110379dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate LOGDEATH("unlinkToDeath: binder=%p recipient=%p\n", target, recipient); 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!target->localBinder()) { 11060b41448506610f73302cc631677823fd8b865ea5Christopher Tate status_t err = NAME_NOT_FOUND; 1107bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate 1108bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate // If we find the matching recipient, proceed to unlink using that 1109bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate DeathRecipientList* list = (DeathRecipientList*) 1110bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate env->GetIntField(obj, gBinderProxyOffsets.mOrgue); 1111bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate sp<JavaDeathRecipient> origJDR = list->find(recipient); 111279dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate LOGDEATH(" unlink found list %p and JDR %p", list, origJDR.get()); 11130b41448506610f73302cc631677823fd8b865ea5Christopher Tate if (origJDR != NULL) { 11140b41448506610f73302cc631677823fd8b865ea5Christopher Tate wp<IBinder::DeathRecipient> dr; 11150b41448506610f73302cc631677823fd8b865ea5Christopher Tate err = target->unlinkToDeath(origJDR, NULL, flags, &dr); 11160b41448506610f73302cc631677823fd8b865ea5Christopher Tate if (err == NO_ERROR && dr != NULL) { 11170b41448506610f73302cc631677823fd8b865ea5Christopher Tate sp<IBinder::DeathRecipient> sdr = dr.promote(); 11180b41448506610f73302cc631677823fd8b865ea5Christopher Tate JavaDeathRecipient* jdr = static_cast<JavaDeathRecipient*>(sdr.get()); 11190b41448506610f73302cc631677823fd8b865ea5Christopher Tate if (jdr != NULL) { 11200b41448506610f73302cc631677823fd8b865ea5Christopher Tate jdr->clearReference(); 11210b41448506610f73302cc631677823fd8b865ea5Christopher Tate } 11220b41448506610f73302cc631677823fd8b865ea5Christopher Tate } 11230b41448506610f73302cc631677823fd8b865ea5Christopher Tate } 11240b41448506610f73302cc631677823fd8b865ea5Christopher Tate 11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err == NO_ERROR || err == DEAD_OBJECT) { 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res = JNI_TRUE; 11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/util/NoSuchElementException", 11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Death link does not exist"); 11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_BinderProxy_destroy(JNIEnv* env, jobject obj) 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder* b = (IBinder*) 1139bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate env->GetIntField(obj, gBinderProxyOffsets.mObject); 1140bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate DeathRecipientList* drl = (DeathRecipientList*) 1141bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate env->GetIntField(obj, gBinderProxyOffsets.mOrgue); 1142bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate 114379dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate LOGDEATH("Destroying BinderProxy %p: binder=%p drl=%p\n", obj, b, drl); 11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(obj, gBinderProxyOffsets.mObject, 0); 1145bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate env->SetIntField(obj, gBinderProxyOffsets.mOrgue, 0); 1146bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate drl->decStrong((void*)javaObjectForIBinder); 11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project b->decStrong(obj); 11480b41448506610f73302cc631677823fd8b865ea5Christopher Tate 1149bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate IPCThreadState::self()->flushCommands(); 11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const JNINativeMethod gBinderProxyMethods[] = { 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* name, signature, funcPtr */ 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"pingBinder", "()Z", (void*)android_os_BinderProxy_pingBinder}, 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"isBinderAlive", "()Z", (void*)android_os_BinderProxy_isBinderAlive}, 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"getInterfaceDescriptor", "()Ljava/lang/String;", (void*)android_os_BinderProxy_getInterfaceDescriptor}, 11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"transact", "(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z", (void*)android_os_BinderProxy_transact}, 11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"linkToDeath", "(Landroid/os/IBinder$DeathRecipient;I)V", (void*)android_os_BinderProxy_linkToDeath}, 11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"unlinkToDeath", "(Landroid/os/IBinder$DeathRecipient;I)Z", (void*)android_os_BinderProxy_unlinkToDeath}, 11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"destroy", "()V", (void*)android_os_BinderProxy_destroy}, 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst char* const kBinderProxyPathName = "android/os/BinderProxy"; 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int int_register_android_os_BinderProxy(JNIEnv* env) 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass clazz; 11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clazz = env->FindClass("java/lang/ref/WeakReference"); 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_FATAL_IF(clazz == NULL, "Unable to find class java.lang.ref.WeakReference"); 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gWeakReferenceOffsets.mClass = (jclass) env->NewGlobalRef(clazz); 11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gWeakReferenceOffsets.mGet 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = env->GetMethodID(clazz, "get", "()Ljava/lang/Object;"); 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assert(gWeakReferenceOffsets.mGet); 11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clazz = env->FindClass("java/lang/Error"); 11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_FATAL_IF(clazz == NULL, "Unable to find class java.lang.Error"); 11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gErrorOffsets.mClass = (jclass) env->NewGlobalRef(clazz); 118169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clazz = env->FindClass(kBinderProxyPathName); 11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_FATAL_IF(clazz == NULL, "Unable to find class android.os.BinderProxy"); 11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderProxyOffsets.mClass = (jclass) env->NewGlobalRef(clazz); 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderProxyOffsets.mConstructor 11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = env->GetMethodID(clazz, "<init>", "()V"); 11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assert(gBinderProxyOffsets.mConstructor); 11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderProxyOffsets.mSendDeathNotice 11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = env->GetStaticMethodID(clazz, "sendDeathNotice", "(Landroid/os/IBinder$DeathRecipient;)V"); 11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assert(gBinderProxyOffsets.mSendDeathNotice); 11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderProxyOffsets.mObject 11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = env->GetFieldID(clazz, "mObject", "I"); 11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assert(gBinderProxyOffsets.mObject); 11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderProxyOffsets.mSelf 11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = env->GetFieldID(clazz, "mSelf", "Ljava/lang/ref/WeakReference;"); 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assert(gBinderProxyOffsets.mSelf); 1199bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate gBinderProxyOffsets.mOrgue 1200bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate = env->GetFieldID(clazz, "mOrgue", "I"); 1201bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate assert(gBinderProxyOffsets.mOrgue); 12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AndroidRuntime::registerNativeMethods( 12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env, kBinderProxyPathName, 12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderProxyMethods, NELEM(gBinderProxyMethods)); 12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_os_Parcel_dataSize(JNIEnv* env, jobject clazz) 12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return parcel ? parcel->dataSize() : 0; 12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_os_Parcel_dataAvail(JNIEnv* env, jobject clazz) 12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return parcel ? parcel->dataAvail() : 0; 12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_os_Parcel_dataPosition(JNIEnv* env, jobject clazz) 12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return parcel ? parcel->dataPosition() : 0; 12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_os_Parcel_dataCapacity(JNIEnv* env, jobject clazz) 12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return parcel ? parcel->dataCapacity() : 0; 12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Parcel_setDataSize(JNIEnv* env, jobject clazz, jint size) 12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel != NULL) { 12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const status_t err = parcel->setDataSize(size); 12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/OutOfMemoryError", NULL); 12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Parcel_setDataPosition(JNIEnv* env, jobject clazz, jint pos) 12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel != NULL) { 12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcel->setDataPosition(pos); 12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Parcel_setDataCapacity(JNIEnv* env, jobject clazz, jint size) 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->setDataCapacity(size); 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_writeNative(JNIEnv* env, jobject clazz, 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject data, jint offset, 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint length) 12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel == NULL) { 12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const status_t err = parcel->writeInt32(length); 12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/OutOfMemoryError", NULL); 12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1280a28b83ee04ca25100781f37a50665d6e1b05e3a2Elliott Hughes void* dest = parcel->writeInplace(length); 12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dest == NULL) { 12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/OutOfMemoryError", NULL); 12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jbyte* ar = (jbyte*)env->GetPrimitiveArrayCritical((jarray)data, 0); 12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ar) { 1288a28b83ee04ca25100781f37a50665d6e1b05e3a2Elliott Hughes memcpy(dest, ar + offset, length); 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleasePrimitiveArrayCritical((jarray)data, ar, 0); 12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Parcel_writeInt(JNIEnv* env, jobject clazz, jint val) 12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel != NULL) { 12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const status_t err = parcel->writeInt32(val); 12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/OutOfMemoryError", NULL); 13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Parcel_writeLong(JNIEnv* env, jobject clazz, jlong val) 13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel != NULL) { 13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const status_t err = parcel->writeInt64(val); 13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/OutOfMemoryError", NULL); 13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Parcel_writeFloat(JNIEnv* env, jobject clazz, jfloat val) 13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel != NULL) { 13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const status_t err = parcel->writeFloat(val); 13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/OutOfMemoryError", NULL); 13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Parcel_writeDouble(JNIEnv* env, jobject clazz, jdouble val) 13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel != NULL) { 13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const status_t err = parcel->writeDouble(val); 13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/OutOfMemoryError", NULL); 13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Parcel_writeString(JNIEnv* env, jobject clazz, jstring val) 13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel != NULL) { 13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = NO_MEMORY; 13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val) { 13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const jchar* str = env->GetStringCritical(val, 0); 13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str) { 13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = parcel->writeString16(str, env->GetStringLength(val)); 13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringCritical(val, str); 13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project err = parcel->writeString16(NULL, 0); 13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/OutOfMemoryError", NULL); 13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Parcel_writeStrongBinder(JNIEnv* env, jobject clazz, jobject object) 13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel != NULL) { 13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const status_t err = parcel->writeStrongBinder(ibinderForJavaObject(env, object)); 13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/OutOfMemoryError", NULL); 13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Parcel_writeFileDescriptor(JNIEnv* env, jobject clazz, jobject object) 13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel != NULL) { 1373a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes const status_t err = 1374a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes parcel->writeDupFileDescriptor(jniGetFDFromFileDescriptor(env, object)); 13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/OutOfMemoryError", NULL); 13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jbyteArray android_os_Parcel_createByteArray(JNIEnv* env, jobject clazz) 13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jbyteArray ret = NULL; 13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel != NULL) { 13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t len = parcel->readInt32(); 13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // sanity check the stored length against the true data size 13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (len >= 0 && len <= (int32_t)parcel->dataAvail()) { 13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ret = env->NewByteArray(len); 13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ret != NULL) { 13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jbyte* a2 = (jbyte*)env->GetPrimitiveArrayCritical(ret, 0); 13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a2) { 13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const void* data = parcel->readInplace(len); 13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memcpy(a2, data, len); 13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleasePrimitiveArrayCritical(ret, a2, 0); 13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ret; 14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_os_Parcel_readInt(JNIEnv* env, jobject clazz) 14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel != NULL) { 14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return parcel->readInt32(); 14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jlong android_os_Parcel_readLong(JNIEnv* env, jobject clazz) 14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel != NULL) { 14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return parcel->readInt64(); 14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jfloat android_os_Parcel_readFloat(JNIEnv* env, jobject clazz) 14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel != NULL) { 14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return parcel->readFloat(); 14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jdouble android_os_Parcel_readDouble(JNIEnv* env, jobject clazz) 14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel != NULL) { 14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return parcel->readDouble(); 14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jstring android_os_Parcel_readString(JNIEnv* env, jobject clazz) 14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel != NULL) { 14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t len; 14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char16_t* str = parcel->readString16Inplace(&len); 14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str) { 14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return env->NewString(str, len); 14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jobject android_os_Parcel_readStrongBinder(JNIEnv* env, jobject clazz) 14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel != NULL) { 14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return javaObjectForIBinder(env, parcel->readStrongBinder()); 14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jobject android_os_Parcel_readFileDescriptor(JNIEnv* env, jobject clazz) 14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel != NULL) { 14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int fd = parcel->readFileDescriptor(); 14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fd < 0) return NULL; 14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fd = dup(fd); 14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fd < 0) return NULL; 1474a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes return jniCreateFileDescriptor(env, fd); 14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jobject android_os_Parcel_openFileDescriptor(JNIEnv* env, jobject clazz, 14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jstring name, jint mode) 14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name == NULL) { 148369a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes jniThrowNullPointerException(env, NULL); 14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const jchar* str = env->GetStringCritical(name, 0); 14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str == NULL) { 14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Whatever, whatever. 14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 name8(str, env->GetStringLength(name)); 14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringCritical(name, str); 14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flags=0; 14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (mode&0x30000000) { 14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 0: 14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 0x10000000: 14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flags = O_RDONLY; 14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 0x20000000: 15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flags = O_WRONLY; 15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 0x30000000: 15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flags = O_RDWR; 15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mode&0x08000000) flags |= O_CREAT; 15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mode&0x04000000) flags |= O_TRUNC; 15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mode&0x02000000) flags |= O_APPEND; 15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int realMode = S_IRWXU|S_IRWXG; 15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mode&0x00000001) realMode |= S_IROTH; 15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mode&0x00000002) realMode |= S_IWOTH; 15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int fd = open(name8.string(), flags, realMode); 15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fd < 0) { 1518e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn jniThrowException(env, "java/io/FileNotFoundException", strerror(errno)); 1519e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn return NULL; 1520e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn } 1521a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes jobject object = jniCreateFileDescriptor(env, fd); 1522e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn if (object == NULL) { 1523e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn close(fd); 1524e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn } 1525e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn return object; 1526e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn} 1527e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn 1528e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackbornstatic jobject android_os_Parcel_dupFileDescriptor(JNIEnv* env, jobject clazz, jobject orig) 1529e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn{ 1530e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn if (orig == NULL) { 153169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes jniThrowNullPointerException(env, NULL); 1532e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn return NULL; 1533e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn } 1534a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes int origfd = jniGetFDFromFileDescriptor(env, orig); 1535e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn if (origfd < 0) { 1536e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn jniThrowException(env, "java/lang/IllegalArgumentException", "bad FileDescriptor"); 1537e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn return NULL; 1538e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn } 1539e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn 1540e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn int fd = dup(origfd); 1541e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn if (fd < 0) { 154269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes jniThrowIOException(env, errno); 15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1545a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes jobject object = jniCreateFileDescriptor(env, fd); 15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (object == NULL) { 15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project close(fd); 15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return object; 15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Parcel_closeFileDescriptor(JNIEnv* env, jobject clazz, jobject object) 15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1554e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn if (object == NULL) { 155569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes jniThrowNullPointerException(env, NULL); 1556e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn return; 1557e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn } 1558a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes int fd = jniGetFDFromFileDescriptor(env, object); 15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fd >= 0) { 1560a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes jniSetFileDescriptorOfFD(env, object, -1); 15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //LOGI("Closing ParcelFileDescriptor %d\n", fd); 15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project close(fd); 15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1566c9119f5034d36f548bbddd8f60291e24ab4e270bDianne Hackbornstatic void android_os_Parcel_clearFileDescriptor(JNIEnv* env, jobject clazz, jobject object) 1567c9119f5034d36f548bbddd8f60291e24ab4e270bDianne Hackborn{ 1568e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn if (object == NULL) { 156969a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes jniThrowNullPointerException(env, NULL); 1570e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn return; 1571e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn } 1572a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes int fd = jniGetFDFromFileDescriptor(env, object); 1573c9119f5034d36f548bbddd8f60291e24ab4e270bDianne Hackborn if (fd >= 0) { 1574a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes jniSetFileDescriptorOfFD(env, object, -1); 1575c9119f5034d36f548bbddd8f60291e24ab4e270bDianne Hackborn } 1576c9119f5034d36f548bbddd8f60291e24ab4e270bDianne Hackborn} 1577c9119f5034d36f548bbddd8f60291e24ab4e270bDianne Hackborn 15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Parcel_freeBuffer(JNIEnv* env, jobject clazz) 15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t own = env->GetIntField(clazz, gParcelOffsets.mOwnObject); 15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (own) { 15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel != NULL) { 15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //LOGI("Parcel.freeBuffer() called for C++ Parcel %p\n", parcel); 15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcel->freeData(); 15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Parcel_init(JNIEnv* env, jobject clazz, jint parcelInt) 15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = (Parcel*)parcelInt; 15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int own = 0; 15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parcel) { 15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //LOGI("Initializing obj %p: creating new Parcel\n", clazz); 15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project own = 1; 15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcel = new Parcel; 15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //LOGI("Initializing obj %p: given existing Parcel %p\n", clazz, parcel); 16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel == NULL) { 16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/OutOfMemoryError", NULL); 16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //LOGI("Initializing obj %p from C++ Parcel %p, own=%d\n", clazz, parcel, own); 16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(clazz, gParcelOffsets.mOwnObject, own); 16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(clazz, gParcelOffsets.mObject, (int)parcel); 16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Parcel_destroy(JNIEnv* env, jobject clazz) 16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t own = env->GetIntField(clazz, gParcelOffsets.mOwnObject); 16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (own) { 16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(clazz, gParcelOffsets.mObject, 0); 16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //LOGI("Destroying obj %p: deleting C++ Parcel %p\n", clazz, parcel); 16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete parcel; 16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(clazz, gParcelOffsets.mObject, 0); 16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //LOGI("Destroying obj %p: leaving C++ Parcel %p\n", clazz); 16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jbyteArray android_os_Parcel_marshall(JNIEnv* env, jobject clazz) 16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel == NULL) { 16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // do not marshall if there are binder objects in the parcel 16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel->objectsCount()) 16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/RuntimeException", "Tried to marshall a Parcel that contained Binder objects."); 16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jbyteArray ret = env->NewByteArray(parcel->dataSize()); 16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ret != NULL) 16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jbyte* array = (jbyte*)env->GetPrimitiveArrayCritical(ret, 0); 16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (array != NULL) 16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memcpy(array, parcel->data(), parcel->dataSize()); 16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleasePrimitiveArrayCritical(ret, array, 0); 16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ret; 16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Parcel_unmarshall(JNIEnv* env, jobject clazz, jbyteArray data, jint offset, jint length) 16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel == NULL || length < 0) { 16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jbyte* array = (jbyte*)env->GetPrimitiveArrayCritical(data, 0); 16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (array) 16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcel->setDataSize(length); 16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcel->setDataPosition(0); 16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void* raw = parcel->writeInplace(length); 16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memcpy(raw, (array + offset), length); 16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleasePrimitiveArrayCritical(data, array, 0); 16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Parcel_appendFrom(JNIEnv* env, jobject clazz, jobject parcel, jint offset, jint length) 16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* thisParcel = parcelForJavaObject(env, clazz); 16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (thisParcel == NULL) { 16779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* otherParcel = parcelForJavaObject(env, parcel); 16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (otherParcel == NULL) { 16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void) thisParcel->appendFrom(otherParcel, offset, length); 16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_os_Parcel_hasFileDescriptors(JNIEnv* env, jobject clazz) 16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jboolean ret = JNI_FALSE; 16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel != NULL) { 16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel->hasFileDescriptors()) { 16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ret = JNI_TRUE; 16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ret; 16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Parcel_writeInterfaceToken(JNIEnv* env, jobject clazz, jstring name) 17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel != NULL) { 17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // In the current implementation, the token is just the serialized interface name that 17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the caller expects to be invoking 17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const jchar* str = env->GetStringCritical(name, 0); 17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != NULL) { 17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcel->writeInterfaceToken(String16(str, env->GetStringLength(name))); 17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringCritical(name, str); 17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Parcel_enforceInterface(JNIEnv* env, jobject clazz, jstring name) 17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jboolean ret = JNI_FALSE; 17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* parcel = parcelForJavaObject(env, clazz); 17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parcel != NULL) { 17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const jchar* str = env->GetStringCritical(name, 0); 17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str) { 17217bcad8a315f12bd6251a998781efac7b11c2ca84Brad Fitzpatrick IPCThreadState* threadState = IPCThreadState::self(); 17227bcad8a315f12bd6251a998781efac7b11c2ca84Brad Fitzpatrick const int32_t oldPolicy = threadState->getStrictModePolicy(); 17237bcad8a315f12bd6251a998781efac7b11c2ca84Brad Fitzpatrick const bool isValid = parcel->enforceInterface( 1724727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick String16(str, env->GetStringLength(name)), 17257bcad8a315f12bd6251a998781efac7b11c2ca84Brad Fitzpatrick threadState); 17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringCritical(name, str); 17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isValid) { 17287bcad8a315f12bd6251a998781efac7b11c2ca84Brad Fitzpatrick const int32_t newPolicy = threadState->getStrictModePolicy(); 17297bcad8a315f12bd6251a998781efac7b11c2ca84Brad Fitzpatrick if (oldPolicy != newPolicy) { 1730727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick // Need to keep the Java-level thread-local strict 1731727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick // mode policy in sync for the libcore 1732727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick // enforcements, which involves an upcall back 1733727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick // into Java. (We can't modify the 1734727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick // Parcel.enforceInterface signature, as it's 1735727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick // pseudo-public, and used via AIDL 1736727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick // auto-generation...) 17377bcad8a315f12bd6251a998781efac7b11c2ca84Brad Fitzpatrick set_dalvik_blockguard_policy(env, newPolicy); 1738727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick } 17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; // everything was correct -> return silently 17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // all error conditions wind up here 17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/SecurityException", 17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Binder invocation to an incorrect interface"); 17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const JNINativeMethod gParcelMethods[] = { 17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"dataSize", "()I", (void*)android_os_Parcel_dataSize}, 17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"dataAvail", "()I", (void*)android_os_Parcel_dataAvail}, 17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"dataPosition", "()I", (void*)android_os_Parcel_dataPosition}, 17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"dataCapacity", "()I", (void*)android_os_Parcel_dataCapacity}, 17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"setDataSize", "(I)V", (void*)android_os_Parcel_setDataSize}, 17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"setDataPosition", "(I)V", (void*)android_os_Parcel_setDataPosition}, 17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"setDataCapacity", "(I)V", (void*)android_os_Parcel_setDataCapacity}, 17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"writeNative", "([BII)V", (void*)android_os_Parcel_writeNative}, 17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"writeInt", "(I)V", (void*)android_os_Parcel_writeInt}, 17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"writeLong", "(J)V", (void*)android_os_Parcel_writeLong}, 17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"writeFloat", "(F)V", (void*)android_os_Parcel_writeFloat}, 17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"writeDouble", "(D)V", (void*)android_os_Parcel_writeDouble}, 17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"writeString", "(Ljava/lang/String;)V", (void*)android_os_Parcel_writeString}, 17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"writeStrongBinder", "(Landroid/os/IBinder;)V", (void*)android_os_Parcel_writeStrongBinder}, 17669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"writeFileDescriptor", "(Ljava/io/FileDescriptor;)V", (void*)android_os_Parcel_writeFileDescriptor}, 17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"createByteArray", "()[B", (void*)android_os_Parcel_createByteArray}, 17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"readInt", "()I", (void*)android_os_Parcel_readInt}, 17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"readLong", "()J", (void*)android_os_Parcel_readLong}, 17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"readFloat", "()F", (void*)android_os_Parcel_readFloat}, 17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"readDouble", "()D", (void*)android_os_Parcel_readDouble}, 17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"readString", "()Ljava/lang/String;", (void*)android_os_Parcel_readString}, 17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"readStrongBinder", "()Landroid/os/IBinder;", (void*)android_os_Parcel_readStrongBinder}, 17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"internalReadFileDescriptor", "()Ljava/io/FileDescriptor;", (void*)android_os_Parcel_readFileDescriptor}, 17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"openFileDescriptor", "(Ljava/lang/String;I)Ljava/io/FileDescriptor;", (void*)android_os_Parcel_openFileDescriptor}, 1776e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn {"dupFileDescriptor", "(Ljava/io/FileDescriptor;)Ljava/io/FileDescriptor;", (void*)android_os_Parcel_dupFileDescriptor}, 17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"closeFileDescriptor", "(Ljava/io/FileDescriptor;)V", (void*)android_os_Parcel_closeFileDescriptor}, 1778c9119f5034d36f548bbddd8f60291e24ab4e270bDianne Hackborn {"clearFileDescriptor", "(Ljava/io/FileDescriptor;)V", (void*)android_os_Parcel_clearFileDescriptor}, 17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"freeBuffer", "()V", (void*)android_os_Parcel_freeBuffer}, 17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"init", "(I)V", (void*)android_os_Parcel_init}, 17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"destroy", "()V", (void*)android_os_Parcel_destroy}, 17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"marshall", "()[B", (void*)android_os_Parcel_marshall}, 17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"unmarshall", "([BII)V", (void*)android_os_Parcel_unmarshall}, 17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"appendFrom", "(Landroid/os/Parcel;II)V", (void*)android_os_Parcel_appendFrom}, 17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"hasFileDescriptors", "()Z", (void*)android_os_Parcel_hasFileDescriptors}, 17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"writeInterfaceToken", "(Ljava/lang/String;)V", (void*)android_os_Parcel_writeInterfaceToken}, 17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"enforceInterface", "(Ljava/lang/String;)V", (void*)android_os_Parcel_enforceInterface}, 17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst char* const kParcelPathName = "android/os/Parcel"; 17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int int_register_android_os_Parcel(JNIEnv* env) 17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass clazz; 17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clazz = env->FindClass("android/util/Log"); 17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_FATAL_IF(clazz == NULL, "Unable to find class android.util.Log"); 17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gLogOffsets.mClass = (jclass) env->NewGlobalRef(clazz); 17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gLogOffsets.mLogE = env->GetStaticMethodID( 18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clazz, "e", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I"); 18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assert(gLogOffsets.mLogE); 18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clazz = env->FindClass("android/os/ParcelFileDescriptor"); 18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_FATAL_IF(clazz == NULL, "Unable to find class android.os.ParcelFileDescriptor"); 18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gParcelFileDescriptorOffsets.mClass = (jclass) env->NewGlobalRef(clazz); 18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gParcelFileDescriptorOffsets.mConstructor 18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = env->GetMethodID(clazz, "<init>", "(Ljava/io/FileDescriptor;)V"); 18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clazz = env->FindClass(kParcelPathName); 18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_FATAL_IF(clazz == NULL, "Unable to find class android.os.Parcel"); 18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gParcelOffsets.mObject 18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = env->GetFieldID(clazz, "mObject", "I"); 18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gParcelOffsets.mOwnObject 18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = env->GetFieldID(clazz, "mOwnObject", "I"); 18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1817727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick clazz = env->FindClass("android/os/StrictMode"); 1818727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick LOG_FATAL_IF(clazz == NULL, "Unable to find class android.os.StrictMode"); 1819727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick gStrictModeCallbackOffsets.mClass = (jclass) env->NewGlobalRef(clazz); 1820727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick gStrictModeCallbackOffsets.mCallback = env->GetStaticMethodID( 1821727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick clazz, "onBinderStrictModePolicyChange", "(I)V"); 1822727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick LOG_FATAL_IF(gStrictModeCallbackOffsets.mCallback == NULL, 1823727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick "Unable to find strict mode callback."); 1824727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick 18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AndroidRuntime::registerNativeMethods( 18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env, kParcelPathName, 18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gParcelMethods, NELEM(gParcelMethods)); 18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_os_Binder(JNIEnv* env) 18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (int_register_android_os_Binder(env) < 0) 18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (int_register_android_os_BinderInternal(env) < 0) 18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (int_register_android_os_BinderProxy(env) < 0) 18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (int_register_android_os_Parcel(env) < 0) 18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1842