android_util_Binder.cpp revision 5b6da1aee884d32d8140e27c5b5b4d16ea4a37c8
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 20d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey#include "android_os_Parcel.h" 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "android_util_Binder.h" 22d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "JNIHelp.h" 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <fcntl.h> 26cfd91e7852bac3f9775cf3d05eedaade070cfecdMark Salyzyn#include <inttypes.h> 27ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick#include <stdio.h> 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/stat.h> 292c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick#include <sys/types.h> 308f26b323d8f78c6a183e74c464864ef7da457267Brad Fitzpatrick#include <unistd.h> 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Atomic.h> 330795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/IInterface.h> 340795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/IPCThreadState.h> 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Log.h> 362c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick#include <utils/SystemClock.h> 370b41448506610f73302cc631677823fd8b865ea5Christopher Tate#include <utils/List.h> 380b41448506610f73302cc631677823fd8b865ea5Christopher Tate#include <utils/KeyedVector.h> 3944bc18664985e845a2299f20b6392d378fad8b4dColin Cross#include <log/logger.h> 400795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/Parcel.h> 410795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/ProcessState.h> 420795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/IServiceManager.h> 435348c014129b766d621ef82a6e42007009ffc310Brad Fitzpatrick#include <utils/threads.h> 440bde66a837542e5bd901d8b8e47c5bd7c4c99fe4Jeff Brown#include <utils/String8.h> 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 46ac5e350e567c7a257ced37dd4e8ca0f4c95f7e81Christopher Tate#include <ScopedUtfChars.h> 47ac5e350e567c7a257ced37dd4e8ca0f4c95f7e81Christopher Tate#include <ScopedLocalRef.h> 48ac5e350e567c7a257ced37dd4e8ca0f4c95f7e81Christopher Tate 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <android_runtime/AndroidRuntime.h> 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5171f2cf116aab893e224056c38ab146bd1538dd3eSteve Block//#undef ALOGV 5271f2cf116aab893e224056c38ab146bd1538dd3eSteve Block//#define ALOGV(...) fprintf(stderr, __VA_ARGS__) 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5479dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate#define DEBUG_DEATH 0 5579dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate#if DEBUG_DEATH 565baa3a62a97544669fba6d65a11c07f252e654ddSteve Block#define LOGDEATH ALOGD 5779dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate#else 5871f2cf116aab893e224056c38ab146bd1538dd3eSteve Block#define LOGDEATH ALOGV 5979dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate#endif 6079dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectusing namespace android; 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct bindernative_offsets_t 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Class state. 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass mClass; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jmethodID mExecTransact; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Object state. 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID mObject; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} gBinderOffsets; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct binderinternal_offsets_t 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Class state. 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass mClass; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jmethodID mForceGc; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} gBinderInternalOffsets; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct debug_offsets_t 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Class state. 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass mClass; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} gDebugOffsets; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct error_offsets_t 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass mClass; 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} gErrorOffsets; 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct binderproxy_offsets_t 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Class state. 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass mClass; 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jmethodID mConstructor; 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jmethodID mSendDeathNotice; 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Object state. 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID mObject; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID mSelf; 114bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate jfieldID mOrgue; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} gBinderProxyOffsets; 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1180d4a792e8d5ebfd182acc8db7cd9b40f3bc51640Christopher Tatestatic struct class_offsets_t 1190d4a792e8d5ebfd182acc8db7cd9b40f3bc51640Christopher Tate{ 1200d4a792e8d5ebfd182acc8db7cd9b40f3bc51640Christopher Tate jmethodID mGetName; 1210d4a792e8d5ebfd182acc8db7cd9b40f3bc51640Christopher Tate} gClassOffsets; 1220d4a792e8d5ebfd182acc8db7cd9b40f3bc51640Christopher Tate 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct log_offsets_t 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Class state. 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass mClass; 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jmethodID mLogE; 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} gLogOffsets; 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct parcel_file_descriptor_offsets_t 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass mClass; 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jmethodID mConstructor; 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} gParcelFileDescriptorOffsets; 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 138727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrickstatic struct strict_mode_callback_offsets_t 139727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick{ 140727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick jclass mClass; 141727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick jmethodID mCallback; 142727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick} gStrictModeCallbackOffsets; 143727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic volatile int32_t gNumRefsCreated = 0; 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic volatile int32_t gNumProxyRefs = 0; 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic volatile int32_t gNumLocalRefs = 0; 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic volatile int32_t gNumDeathRefs = 0; 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void incRefsCreated(JNIEnv* env) 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int old = android_atomic_inc(&gNumRefsCreated); 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (old == 200) { 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android_atomic_and(0, &gNumRefsCreated); 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->CallStaticVoidMethod(gBinderInternalOffsets.mClass, 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderInternalOffsets.mForceGc); 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 16171f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("Now have %d binder ops", old); 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JavaVM* jnienv_to_javavm(JNIEnv* env) 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JavaVM* vm; 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return env->GetJavaVM(&vm) >= 0 ? vm : NULL; 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNIEnv* javavm_to_jnienv(JavaVM* vm) 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv* env; 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return vm->GetEnv((void **)&env, JNI_VERSION_1_4) >= 0 ? env : NULL; 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void report_exception(JNIEnv* env, jthrowable excep, const char* msg) 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ExceptionClear(); 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jstring tagstr = env->NewStringUTF(LOG_TAG); 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jstring msgstr = env->NewStringUTF(msg); 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((tagstr == NULL) || (msgstr == NULL)) { 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ExceptionClear(); /* assume exception (OOM?) was thrown */ 1863762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Unable to call Log.e()\n"); 1873762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("%s", msg); 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->CallStaticIntMethod( 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gLogOffsets.mClass, gLogOffsets.mLogE, tagstr, msgstr, excep); 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (env->ExceptionCheck()) { 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* attempting to log the failure has failed */ 1958564c8da817a845353d213acd8636b76f567b234Steve Block ALOGW("Failed trying to log exception, msg='%s'\n", msg); 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ExceptionClear(); 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (env->IsInstanceOf(excep, gErrorOffsets.mClass)) { 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * It's an Error: Reraise the exception, detach this thread, and 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * wait for the fireworks. Die even more blatantly after a minute 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if the gentler attempt doesn't do the trick. 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The GetJavaVM function isn't on the "approved" list of JNI calls 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that can be made while an exception is pending, so we want to 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * get the VM ptr, throw the exception, and then detach the thread. 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JavaVM* vm = jnienv_to_javavm(env); 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->Throw(excep); 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project vm->DetachCurrentThread(); 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sleep(60); 2133762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Forcefully exiting"); 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project exit(1); 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *((int *) 1) = 1; 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbail: 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* discard local refs created for us by VM */ 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->DeleteLocalRef(tagstr); 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->DeleteLocalRef(msgstr); 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass JavaBBinderHolder; 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass JavaBBinder : public BBinder 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JavaBBinder(JNIEnv* env, jobject object) 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : mVM(jnienv_to_javavm(env)), mObject(env->NewGlobalRef(object)) 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 23271f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("Creating JavaBBinder %p\n", this); 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android_atomic_inc(&gNumLocalRefs); 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project incRefsCreated(env); 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool checkSubclass(const void* subclassID) const 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return subclassID == &gBinderOffsets; 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject object() const 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mObject; 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprotected: 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual ~JavaBBinder() 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 25071f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("Destroying JavaBBinder %p\n", this); 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android_atomic_dec(&gNumLocalRefs); 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv* env = javavm_to_jnienv(mVM); 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->DeleteGlobalRef(mObject); 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t onTransact( 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags = 0) 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv* env = javavm_to_jnienv(mVM); 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26171f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("onTransact() on %p calling object %p in env %p vm %p\n", this, mObject, env, mVM); 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 263727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick IPCThreadState* thread_state = IPCThreadState::self(); 264727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick const int strict_policy_before = thread_state->getStrictModePolicy(); 2650234376503ce421c4b871d5d811c541f5094301aBrad Fitzpatrick thread_state->setLastTransactionBinderFlags(flags); 266727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("Transact from %p to Java code sending: ", this); 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //data.print(); 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("\n"); 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jboolean res = env->CallBooleanMethod(mObject, gBinderOffsets.mExecTransact, 2718ab665dda40ab10e60fc69392022171f454af530Ashok Bhat code, reinterpret_cast<jlong>(&data), reinterpret_cast<jlong>(reply), flags); 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jthrowable excep = env->ExceptionOccurred(); 273727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick 2749013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert if (excep) { 2759013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert report_exception(env, excep, 2769013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert "*** Uncaught remote exception! " 2779013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert "(Exceptions are not yet supported across processes.)"); 2789013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert res = JNI_FALSE; 2799013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert 2809013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert /* clean up JNI local ref -- we don't return to Java code */ 2819013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert env->DeleteLocalRef(excep); 2829013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert } 2839013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert 284727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick // Restore the Java binder thread's state if it changed while 285727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick // processing a call (as it would if the Parcel's header had a 286727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick // new policy mask and Parcel.enforceInterface() changed 287727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick // it...) 288727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick const int strict_policy_after = thread_state->getStrictModePolicy(); 289727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick if (strict_policy_after != strict_policy_before) { 290727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick // Our thread-local... 291727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick thread_state->setStrictModePolicy(strict_policy_before); 292727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick // And the Java-level thread-local... 293727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick set_dalvik_blockguard_policy(env, strict_policy_before); 294727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick } 295727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick 2969013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert jthrowable excep2 = env->ExceptionOccurred(); 2979013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert if (excep2) { 2989013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert report_exception(env, excep2, 2999013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert "*** Uncaught exception in onBinderStrictModePolicyChange"); 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* clean up JNI local ref -- we don't return to Java code */ 3019013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert env->DeleteLocalRef(excep2); 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 304a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn // Need to always call through the native implementation of 305a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn // SYSPROPS_TRANSACTION. 306a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn if (code == SYSPROPS_TRANSACTION) { 307a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn BBinder::onTransact(code, data, reply, flags); 308a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn } 309a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //aout << "onTransact to Java code; result=" << res << endl 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // << "Transact from " << this << " to Java code returning " 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // << reply << ": " << *reply << endl; 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res != JNI_FALSE ? NO_ERROR : UNKNOWN_TRANSACTION; 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t dump(int fd, const Vector<String16>& args) 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JavaVM* const mVM; 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject const mObject; 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass JavaBBinderHolder : public RefBase 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 3310b41448506610f73302cc631677823fd8b865ea5Christopher Tate sp<JavaBBinder> get(JNIEnv* env, jobject obj) 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AutoMutex _l(mLock); 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<JavaBBinder> b = mBinder.promote(); 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (b == NULL) { 3360b41448506610f73302cc631677823fd8b865ea5Christopher Tate b = new JavaBBinder(env, obj); 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBinder = b; 338cfd91e7852bac3f9775cf3d05eedaade070cfecdMark Salyzyn ALOGV("Creating JavaBinder %p (refs %p) for Object %p, weakCount=%" PRId32 "\n", 3390b41448506610f73302cc631677823fd8b865ea5Christopher Tate b.get(), b->getWeakRefs(), obj, b->getWeakRefs()->getWeakCount()); 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return b; 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<JavaBBinder> getExisting() 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AutoMutex _l(mLock); 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBinder.promote(); 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex mLock; 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wp<JavaBBinder> mBinder; 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3580b41448506610f73302cc631677823fd8b865ea5Christopher Tate// Per-IBinder death recipient bookkeeping. This is how we reconcile local jobject 3590b41448506610f73302cc631677823fd8b865ea5Christopher Tate// death recipient references passed in through JNI with the permanent corresponding 3600b41448506610f73302cc631677823fd8b865ea5Christopher Tate// JavaDeathRecipient objects. 3610b41448506610f73302cc631677823fd8b865ea5Christopher Tate 3620b41448506610f73302cc631677823fd8b865ea5Christopher Tateclass JavaDeathRecipient; 3630b41448506610f73302cc631677823fd8b865ea5Christopher Tate 3640b41448506610f73302cc631677823fd8b865ea5Christopher Tateclass DeathRecipientList : public RefBase { 3650b41448506610f73302cc631677823fd8b865ea5Christopher Tate List< sp<JavaDeathRecipient> > mList; 3660b41448506610f73302cc631677823fd8b865ea5Christopher Tate Mutex mLock; 3670b41448506610f73302cc631677823fd8b865ea5Christopher Tate 3680b41448506610f73302cc631677823fd8b865ea5Christopher Tatepublic: 36979dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate DeathRecipientList(); 3700b41448506610f73302cc631677823fd8b865ea5Christopher Tate ~DeathRecipientList(); 3710b41448506610f73302cc631677823fd8b865ea5Christopher Tate 3720b41448506610f73302cc631677823fd8b865ea5Christopher Tate void add(const sp<JavaDeathRecipient>& recipient); 3730b41448506610f73302cc631677823fd8b865ea5Christopher Tate void remove(const sp<JavaDeathRecipient>& recipient); 3740b41448506610f73302cc631677823fd8b865ea5Christopher Tate sp<JavaDeathRecipient> find(jobject recipient); 3750b41448506610f73302cc631677823fd8b865ea5Christopher Tate}; 3760b41448506610f73302cc631677823fd8b865ea5Christopher Tate 3770b41448506610f73302cc631677823fd8b865ea5Christopher Tate// ---------------------------------------------------------------------------- 3780b41448506610f73302cc631677823fd8b865ea5Christopher Tate 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass JavaDeathRecipient : public IBinder::DeathRecipient 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 382bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate JavaDeathRecipient(JNIEnv* env, jobject object, const sp<DeathRecipientList>& list) 38386284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate : mVM(jnienv_to_javavm(env)), mObject(env->NewGlobalRef(object)), 38486284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate mObjectWeak(NULL), mList(list) 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3860b41448506610f73302cc631677823fd8b865ea5Christopher Tate // These objects manage their own lifetimes so are responsible for final bookkeeping. 3870b41448506610f73302cc631677823fd8b865ea5Christopher Tate // The list holds a strong reference to this object. 38879dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate LOGDEATH("Adding JDR %p to DRL %p", this, list.get()); 389bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate list->add(this); 3900b41448506610f73302cc631677823fd8b865ea5Christopher Tate 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android_atomic_inc(&gNumDeathRefs); 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project incRefsCreated(env); 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void binderDied(const wp<IBinder>& who) 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 39779dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate LOGDEATH("Receiving binderDied() on JavaDeathRecipient %p\n", this); 39886284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate if (mObject != NULL) { 39986284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate JNIEnv* env = javavm_to_jnienv(mVM); 40086284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate 40186284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate env->CallStaticVoidMethod(gBinderProxyOffsets.mClass, 40286284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate gBinderProxyOffsets.mSendDeathNotice, mObject); 40386284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate jthrowable excep = env->ExceptionOccurred(); 40486284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate if (excep) { 40586284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate report_exception(env, excep, 40686284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate "*** Uncaught exception returned from death notification!"); 40786284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate } 40886284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate 40986284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate // Demote from strong ref to weak after binderDied() has been delivered, 41086284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate // to allow the DeathRecipient and BinderProxy to be GC'd if no longer needed. 41186284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate mObjectWeak = env->NewWeakGlobalRef(mObject); 41286284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate env->DeleteGlobalRef(mObject); 41386284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate mObject = NULL; 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void clearReference() 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 419bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate sp<DeathRecipientList> list = mList.promote(); 420bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate if (list != NULL) { 42179dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate LOGDEATH("Removing JDR %p from DRL %p", this, list.get()); 422bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate list->remove(this); 42379dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate } else { 42479dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate LOGDEATH("clearReference() on JDR %p but DRL wp purged", this); 425bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate } 4260b41448506610f73302cc631677823fd8b865ea5Christopher Tate } 4270b41448506610f73302cc631677823fd8b865ea5Christopher Tate 4280b41448506610f73302cc631677823fd8b865ea5Christopher Tate bool matches(jobject obj) { 42986284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate bool result; 4300b41448506610f73302cc631677823fd8b865ea5Christopher Tate JNIEnv* env = javavm_to_jnienv(mVM); 43186284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate 43286284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate if (mObject != NULL) { 43386284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate result = env->IsSameObject(obj, mObject); 43486284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate } else { 43586284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate jobject me = env->NewLocalRef(mObjectWeak); 43686284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate result = env->IsSameObject(obj, me); 43786284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate env->DeleteLocalRef(me); 43886284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate } 43986284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate return result; 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 442ac5e350e567c7a257ced37dd4e8ca0f4c95f7e81Christopher Tate void warnIfStillLive() { 443ac5e350e567c7a257ced37dd4e8ca0f4c95f7e81Christopher Tate if (mObject != NULL) { 444ac5e350e567c7a257ced37dd4e8ca0f4c95f7e81Christopher Tate // Okay, something is wrong -- we have a hard reference to a live death 445ac5e350e567c7a257ced37dd4e8ca0f4c95f7e81Christopher Tate // recipient on the VM side, but the list is being torn down. 446ac5e350e567c7a257ced37dd4e8ca0f4c95f7e81Christopher Tate JNIEnv* env = javavm_to_jnienv(mVM); 4470d4a792e8d5ebfd182acc8db7cd9b40f3bc51640Christopher Tate ScopedLocalRef<jclass> objClassRef(env, env->GetObjectClass(mObject)); 4480d4a792e8d5ebfd182acc8db7cd9b40f3bc51640Christopher Tate ScopedLocalRef<jstring> nameRef(env, 4490d4a792e8d5ebfd182acc8db7cd9b40f3bc51640Christopher Tate (jstring) env->CallObjectMethod(objClassRef.get(), gClassOffsets.mGetName)); 4500d4a792e8d5ebfd182acc8db7cd9b40f3bc51640Christopher Tate ScopedUtfChars nameUtf(env, nameRef.get()); 4510d4a792e8d5ebfd182acc8db7cd9b40f3bc51640Christopher Tate if (nameUtf.c_str() != NULL) { 4528564c8da817a845353d213acd8636b76f567b234Steve Block ALOGW("BinderProxy is being destroyed but the application did not call " 4530d4a792e8d5ebfd182acc8db7cd9b40f3bc51640Christopher Tate "unlinkToDeath to unlink all of its death recipients beforehand. " 4540d4a792e8d5ebfd182acc8db7cd9b40f3bc51640Christopher Tate "Releasing leaked death recipient: %s", nameUtf.c_str()); 4550d4a792e8d5ebfd182acc8db7cd9b40f3bc51640Christopher Tate } else { 4568564c8da817a845353d213acd8636b76f567b234Steve Block ALOGW("BinderProxy being destroyed; unable to get DR object name"); 4570d4a792e8d5ebfd182acc8db7cd9b40f3bc51640Christopher Tate env->ExceptionClear(); 4580d4a792e8d5ebfd182acc8db7cd9b40f3bc51640Christopher Tate } 459ac5e350e567c7a257ced37dd4e8ca0f4c95f7e81Christopher Tate } 460ac5e350e567c7a257ced37dd4e8ca0f4c95f7e81Christopher Tate } 461ac5e350e567c7a257ced37dd4e8ca0f4c95f7e81Christopher Tate 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprotected: 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual ~JavaDeathRecipient() 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 4656215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block //ALOGI("Removing death ref: recipient=%p\n", mObject); 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android_atomic_dec(&gNumDeathRefs); 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv* env = javavm_to_jnienv(mVM); 46886284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate if (mObject != NULL) { 46986284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate env->DeleteGlobalRef(mObject); 47086284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate } else { 47186284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate env->DeleteWeakGlobalRef(mObjectWeak); 47286284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate } 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 47686284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate JavaVM* const mVM; 47786284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate jobject mObject; 47886284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate jweak mObjectWeak; // will be a weak ref to the same VM-side DeathRecipient after binderDied() 479bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate wp<DeathRecipientList> mList; 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 48479dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher TateDeathRecipientList::DeathRecipientList() { 48579dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate LOGDEATH("New DRL @ %p", this); 48679dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate} 48779dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate 4880b41448506610f73302cc631677823fd8b865ea5Christopher TateDeathRecipientList::~DeathRecipientList() { 48979dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate LOGDEATH("Destroy DRL @ %p", this); 4900b41448506610f73302cc631677823fd8b865ea5Christopher Tate AutoMutex _l(mLock); 4910b41448506610f73302cc631677823fd8b865ea5Christopher Tate 4920b41448506610f73302cc631677823fd8b865ea5Christopher Tate // Should never happen -- the JavaDeathRecipient objects that have added themselves 4930b41448506610f73302cc631677823fd8b865ea5Christopher Tate // to the list are holding references on the list object. Only when they are torn 4940b41448506610f73302cc631677823fd8b865ea5Christopher Tate // down can the list header be destroyed. 4950b41448506610f73302cc631677823fd8b865ea5Christopher Tate if (mList.size() > 0) { 496ac5e350e567c7a257ced37dd4e8ca0f4c95f7e81Christopher Tate List< sp<JavaDeathRecipient> >::iterator iter; 497ac5e350e567c7a257ced37dd4e8ca0f4c95f7e81Christopher Tate for (iter = mList.begin(); iter != mList.end(); iter++) { 498ac5e350e567c7a257ced37dd4e8ca0f4c95f7e81Christopher Tate (*iter)->warnIfStillLive(); 499ac5e350e567c7a257ced37dd4e8ca0f4c95f7e81Christopher Tate } 5000b41448506610f73302cc631677823fd8b865ea5Christopher Tate } 5010b41448506610f73302cc631677823fd8b865ea5Christopher Tate} 5020b41448506610f73302cc631677823fd8b865ea5Christopher Tate 5030b41448506610f73302cc631677823fd8b865ea5Christopher Tatevoid DeathRecipientList::add(const sp<JavaDeathRecipient>& recipient) { 5040b41448506610f73302cc631677823fd8b865ea5Christopher Tate AutoMutex _l(mLock); 5050b41448506610f73302cc631677823fd8b865ea5Christopher Tate 50679dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate LOGDEATH("DRL @ %p : add JDR %p", this, recipient.get()); 5070b41448506610f73302cc631677823fd8b865ea5Christopher Tate mList.push_back(recipient); 5080b41448506610f73302cc631677823fd8b865ea5Christopher Tate} 5090b41448506610f73302cc631677823fd8b865ea5Christopher Tate 5100b41448506610f73302cc631677823fd8b865ea5Christopher Tatevoid DeathRecipientList::remove(const sp<JavaDeathRecipient>& recipient) { 5110b41448506610f73302cc631677823fd8b865ea5Christopher Tate AutoMutex _l(mLock); 5120b41448506610f73302cc631677823fd8b865ea5Christopher Tate 5130b41448506610f73302cc631677823fd8b865ea5Christopher Tate List< sp<JavaDeathRecipient> >::iterator iter; 5140b41448506610f73302cc631677823fd8b865ea5Christopher Tate for (iter = mList.begin(); iter != mList.end(); iter++) { 5150b41448506610f73302cc631677823fd8b865ea5Christopher Tate if (*iter == recipient) { 51679dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate LOGDEATH("DRL @ %p : remove JDR %p", this, recipient.get()); 5170b41448506610f73302cc631677823fd8b865ea5Christopher Tate mList.erase(iter); 5180b41448506610f73302cc631677823fd8b865ea5Christopher Tate return; 5190b41448506610f73302cc631677823fd8b865ea5Christopher Tate } 5200b41448506610f73302cc631677823fd8b865ea5Christopher Tate } 5210b41448506610f73302cc631677823fd8b865ea5Christopher Tate} 5220b41448506610f73302cc631677823fd8b865ea5Christopher Tate 5230b41448506610f73302cc631677823fd8b865ea5Christopher Tatesp<JavaDeathRecipient> DeathRecipientList::find(jobject recipient) { 5240b41448506610f73302cc631677823fd8b865ea5Christopher Tate AutoMutex _l(mLock); 5250b41448506610f73302cc631677823fd8b865ea5Christopher Tate 5260b41448506610f73302cc631677823fd8b865ea5Christopher Tate List< sp<JavaDeathRecipient> >::iterator iter; 5270b41448506610f73302cc631677823fd8b865ea5Christopher Tate for (iter = mList.begin(); iter != mList.end(); iter++) { 5280b41448506610f73302cc631677823fd8b865ea5Christopher Tate if ((*iter)->matches(recipient)) { 5290b41448506610f73302cc631677823fd8b865ea5Christopher Tate return *iter; 5300b41448506610f73302cc631677823fd8b865ea5Christopher Tate } 5310b41448506610f73302cc631677823fd8b865ea5Christopher Tate } 5320b41448506610f73302cc631677823fd8b865ea5Christopher Tate return NULL; 5330b41448506610f73302cc631677823fd8b865ea5Christopher Tate} 5340b41448506610f73302cc631677823fd8b865ea5Christopher Tate 5350b41448506610f73302cc631677823fd8b865ea5Christopher Tate// ---------------------------------------------------------------------------- 5360b41448506610f73302cc631677823fd8b865ea5Christopher Tate 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void proxy_cleanup(const void* id, void* obj, void* cleanupCookie) 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android_atomic_dec(&gNumProxyRefs); 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv* env = javavm_to_jnienv((JavaVM*)cleanupCookie); 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->DeleteGlobalRef((jobject)obj); 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic Mutex mProxyLock; 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjobject javaObjectForIBinder(JNIEnv* env, const sp<IBinder>& val) 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val == NULL) return NULL; 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val->checkSubclass(&gBinderOffsets)) { 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // One of our own! 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject object = static_cast<JavaBBinder*>(val.get())->object(); 55586284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate LOGDEATH("objectForBinder %p: it's our own %p!\n", val.get(), object); 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return object; 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // For the rest of the function we will hold this lock, to serialize 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // looking/creation of Java proxies for native Binder proxies. 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AutoMutex _l(mProxyLock); 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Someone else's... do we know about it? 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject object = (jobject)val->findObject(&gBinderProxyOffsets); 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (object != NULL) { 566a4ca8ea0ad14c509d1ced46482e83c1b8a518982Jeff Brown jobject res = jniGetReferent(env, object); 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != NULL) { 56871f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("objectForBinder %p: found existing %p!\n", val.get(), res); 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 57186284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate LOGDEATH("Proxy object %p of IBinder %p no longer in working set!!!", object, val.get()); 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android_atomic_dec(&gNumProxyRefs); 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val->detachObject(&gBinderProxyOffsets); 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->DeleteGlobalRef(object); 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project object = env->NewObject(gBinderProxyOffsets.mClass, gBinderProxyOffsets.mConstructor); 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (object != NULL) { 57979dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate LOGDEATH("objectForBinder %p: created new proxy %p !\n", val.get(), object); 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The proxy holds a reference to the native object. 5818ab665dda40ab10e60fc69392022171f454af530Ashok Bhat env->SetLongField(object, gBinderProxyOffsets.mObject, (jlong)val.get()); 582b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopian val->incStrong((void*)javaObjectForIBinder); 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The native object needs to hold a weak reference back to the 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // proxy, so we can retrieve the same proxy if it is still active. 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject refObject = env->NewGlobalRef( 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->GetObjectField(object, gBinderProxyOffsets.mSelf)); 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val->attachObject(&gBinderProxyOffsets, refObject, 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jnienv_to_javavm(env), proxy_cleanup); 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 591bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate // Also remember the death recipients registered on this proxy 592bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate sp<DeathRecipientList> drl = new DeathRecipientList; 593bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate drl->incStrong((void*)javaObjectForIBinder); 5948ab665dda40ab10e60fc69392022171f454af530Ashok Bhat env->SetLongField(object, gBinderProxyOffsets.mOrgue, reinterpret_cast<jlong>(drl.get())); 595bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Note that a new object reference has been created. 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android_atomic_inc(&gNumProxyRefs); 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project incRefsCreated(env); 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return object; 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<IBinder> ibinderForJavaObject(JNIEnv* env, jobject obj) 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (obj == NULL) return NULL; 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (env->IsInstanceOf(obj, gBinderOffsets.mClass)) { 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JavaBBinderHolder* jbh = (JavaBBinderHolder*) 6108ab665dda40ab10e60fc69392022171f454af530Ashok Bhat env->GetLongField(obj, gBinderOffsets.mObject); 6110b41448506610f73302cc631677823fd8b865ea5Christopher Tate return jbh != NULL ? jbh->get(env, obj) : NULL; 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (env->IsInstanceOf(obj, gBinderProxyOffsets.mClass)) { 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (IBinder*) 6168ab665dda40ab10e60fc69392022171f454af530Ashok Bhat env->GetLongField(obj, gBinderProxyOffsets.mObject); 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6198564c8da817a845353d213acd8636b76f567b234Steve Block ALOGW("ibinderForJavaObject: %p is not a Binder object", obj); 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjobject newParcelFileDescriptor(JNIEnv* env, jobject fileDesc) 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return env->NewObject( 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gParcelFileDescriptorOffsets.mClass, gParcelFileDescriptorOffsets.mConstructor, fileDesc); 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 629d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkeyvoid set_dalvik_blockguard_policy(JNIEnv* env, jint strict_policy) 630d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey{ 631d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey // Call back into android.os.StrictMode#onBinderStrictModePolicyChange 632d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey // to sync our state back to it. See the comments in StrictMode.java. 633d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey env->CallStaticVoidMethod(gStrictModeCallbackOffsets.mClass, 634d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey gStrictModeCallbackOffsets.mCallback, 635d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey strict_policy); 636d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey} 637d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 638d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkeyvoid signalExceptionForError(JNIEnv* env, jobject obj, status_t err, 639d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey bool canThrowRemoteException) 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (err) { 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case UNKNOWN_ERROR: 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/RuntimeException", "Unknown error"); 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case NO_MEMORY: 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/OutOfMemoryError", NULL); 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case INVALID_OPERATION: 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/UnsupportedOperationException", NULL); 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BAD_VALUE: 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BAD_INDEX: 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IndexOutOfBoundsException", NULL); 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BAD_TYPE: 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case NAME_NOT_FOUND: 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/util/NoSuchElementException", NULL); 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PERMISSION_DENIED: 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/SecurityException", NULL); 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case NOT_ENOUGH_DATA: 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "android/os/ParcelFormatException", "Not enough data"); 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case NO_INIT: 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/RuntimeException", "Not initialized"); 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case ALREADY_EXISTS: 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/RuntimeException", "Item already exists"); 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DEAD_OBJECT: 6760bde66a837542e5bd901d8b8e47c5bd7c4c99fe4Jeff Brown // DeadObjectException is a checked exception, only throw from certain methods. 6770bde66a837542e5bd901d8b8e47c5bd7c4c99fe4Jeff Brown jniThrowException(env, canThrowRemoteException 6780bde66a837542e5bd901d8b8e47c5bd7c4c99fe4Jeff Brown ? "android/os/DeadObjectException" 6790bde66a837542e5bd901d8b8e47c5bd7c4c99fe4Jeff Brown : "java/lang/RuntimeException", NULL); 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case UNKNOWN_TRANSACTION: 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/RuntimeException", "Unknown transaction code"); 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case FAILED_TRANSACTION: 6853762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("!!! FAILED BINDER TRANSACTION !!!"); 6860bde66a837542e5bd901d8b8e47c5bd7c4c99fe4Jeff Brown // TransactionTooLargeException is a checked exception, only throw from certain methods. 6870bde66a837542e5bd901d8b8e47c5bd7c4c99fe4Jeff Brown // FIXME: Transaction too large is the most common reason for FAILED_TRANSACTION 6880bde66a837542e5bd901d8b8e47c5bd7c4c99fe4Jeff Brown // but it is not the only one. The Binder driver can return BR_FAILED_REPLY 6890bde66a837542e5bd901d8b8e47c5bd7c4c99fe4Jeff Brown // for other reasons also, such as if the transaction is malformed or 6900bde66a837542e5bd901d8b8e47c5bd7c4c99fe4Jeff Brown // refers to an FD that has been closed. We should change the driver 6910bde66a837542e5bd901d8b8e47c5bd7c4c99fe4Jeff Brown // to enable us to distinguish these cases in the future. 6920bde66a837542e5bd901d8b8e47c5bd7c4c99fe4Jeff Brown jniThrowException(env, canThrowRemoteException 6930bde66a837542e5bd901d8b8e47c5bd7c4c99fe4Jeff Brown ? "android/os/TransactionTooLargeException" 6940bde66a837542e5bd901d8b8e47c5bd7c4c99fe4Jeff Brown : "java/lang/RuntimeException", NULL); 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6969ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn case FDS_NOT_ALLOWED: 6979ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn jniThrowException(env, "java/lang/RuntimeException", 6989ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn "Not allowed to write file descriptors here"); 6999ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn break; 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 701cfd91e7852bac3f9775cf3d05eedaade070cfecdMark Salyzyn ALOGE("Unknown binder error code. 0x%" PRIx32, err); 7020bde66a837542e5bd901d8b8e47c5bd7c4c99fe4Jeff Brown String8 msg; 703cfd91e7852bac3f9775cf3d05eedaade070cfecdMark Salyzyn msg.appendFormat("Unknown binder error code. 0x%" PRIx32, err); 7040bde66a837542e5bd901d8b8e47c5bd7c4c99fe4Jeff Brown // RemoteException is a checked exception, only throw from certain methods. 7050bde66a837542e5bd901d8b8e47c5bd7c4c99fe4Jeff Brown jniThrowException(env, canThrowRemoteException 7060bde66a837542e5bd901d8b8e47c5bd7c4c99fe4Jeff Brown ? "android/os/RemoteException" : "java/lang/RuntimeException", msg.string()); 7070bde66a837542e5bd901d8b8e47c5bd7c4c99fe4Jeff Brown break; 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_os_Binder_getCallingPid(JNIEnv* env, jobject clazz) 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return IPCThreadState::self()->getCallingPid(); 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_os_Binder_getCallingUid(JNIEnv* env, jobject clazz) 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return IPCThreadState::self()->getCallingUid(); 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jlong android_os_Binder_clearCallingIdentity(JNIEnv* env, jobject clazz) 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return IPCThreadState::self()->clearCallingIdentity(); 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Binder_restoreCallingIdentity(JNIEnv* env, jobject clazz, jlong token) 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 732cf3004a46eabb49f3eee483067e75aef7b0a69e7Dianne Hackborn // XXX temporary sanity check to debug crashes. 733cf3004a46eabb49f3eee483067e75aef7b0a69e7Dianne Hackborn int uid = (int)(token>>32); 734cf3004a46eabb49f3eee483067e75aef7b0a69e7Dianne Hackborn if (uid > 0 && uid < 999) { 735cf3004a46eabb49f3eee483067e75aef7b0a69e7Dianne Hackborn // In Android currently there are no uids in this range. 736cf3004a46eabb49f3eee483067e75aef7b0a69e7Dianne Hackborn char buf[128]; 737cfd91e7852bac3f9775cf3d05eedaade070cfecdMark Salyzyn sprintf(buf, "Restoring bad calling ident: 0x%" PRIx64, token); 738cf3004a46eabb49f3eee483067e75aef7b0a69e7Dianne Hackborn jniThrowException(env, "java/lang/IllegalStateException", buf); 739cf3004a46eabb49f3eee483067e75aef7b0a69e7Dianne Hackborn return; 740cf3004a46eabb49f3eee483067e75aef7b0a69e7Dianne Hackborn } 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IPCThreadState::self()->restoreCallingIdentity(token); 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 744727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrickstatic void android_os_Binder_setThreadStrictModePolicy(JNIEnv* env, jobject clazz, jint policyMask) 745727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick{ 746727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick IPCThreadState::self()->setStrictModePolicy(policyMask); 747727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick} 748727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick 749727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrickstatic jint android_os_Binder_getThreadStrictModePolicy(JNIEnv* env, jobject clazz) 750727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick{ 751727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick return IPCThreadState::self()->getStrictModePolicy(); 752727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick} 753727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Binder_flushPendingCommands(JNIEnv* env, jobject clazz) 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IPCThreadState::self()->flushCommands(); 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7590b41448506610f73302cc631677823fd8b865ea5Christopher Tatestatic void android_os_Binder_init(JNIEnv* env, jobject obj) 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7610b41448506610f73302cc631677823fd8b865ea5Christopher Tate JavaBBinderHolder* jbh = new JavaBBinderHolder(); 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (jbh == NULL) { 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/OutOfMemoryError", NULL); 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 76671f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("Java Binder %p: acquiring first ref on holder %p", obj, jbh); 7670b41448506610f73302cc631677823fd8b865ea5Christopher Tate jbh->incStrong((void*)android_os_Binder_init); 7688ab665dda40ab10e60fc69392022171f454af530Ashok Bhat env->SetLongField(obj, gBinderOffsets.mObject, (jlong)jbh); 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7710b41448506610f73302cc631677823fd8b865ea5Christopher Tatestatic void android_os_Binder_destroy(JNIEnv* env, jobject obj) 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JavaBBinderHolder* jbh = (JavaBBinderHolder*) 7748ab665dda40ab10e60fc69392022171f454af530Ashok Bhat env->GetLongField(obj, gBinderOffsets.mObject); 775582763ae4e2910b4059dccdfd30a447e9fc974d5Jeff Brown if (jbh != NULL) { 7768ab665dda40ab10e60fc69392022171f454af530Ashok Bhat env->SetLongField(obj, gBinderOffsets.mObject, 0); 77771f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("Java Binder %p: removing ref on holder %p", obj, jbh); 7780b41448506610f73302cc631677823fd8b865ea5Christopher Tate jbh->decStrong((void*)android_os_Binder_init); 779582763ae4e2910b4059dccdfd30a447e9fc974d5Jeff Brown } else { 780582763ae4e2910b4059dccdfd30a447e9fc974d5Jeff Brown // Encountering an uninitialized binder is harmless. All it means is that 781582763ae4e2910b4059dccdfd30a447e9fc974d5Jeff Brown // the Binder was only partially initialized when its finalizer ran and called 782582763ae4e2910b4059dccdfd30a447e9fc974d5Jeff Brown // destroy(). The Binder could be partially initialized for several reasons. 783582763ae4e2910b4059dccdfd30a447e9fc974d5Jeff Brown // For example, a Binder subclass constructor might have thrown an exception before 784582763ae4e2910b4059dccdfd30a447e9fc974d5Jeff Brown // it could delegate to its superclass's constructor. Consequently init() would 785582763ae4e2910b4059dccdfd30a447e9fc974d5Jeff Brown // not have been called and the holder pointer would remain NULL. 78671f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("Java Binder %p: ignoring uninitialized binder", obj); 787582763ae4e2910b4059dccdfd30a447e9fc974d5Jeff Brown } 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const JNINativeMethod gBinderMethods[] = { 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* name, signature, funcPtr */ 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "getCallingPid", "()I", (void*)android_os_Binder_getCallingPid }, 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "getCallingUid", "()I", (void*)android_os_Binder_getCallingUid }, 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "clearCallingIdentity", "()J", (void*)android_os_Binder_clearCallingIdentity }, 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "restoreCallingIdentity", "(J)V", (void*)android_os_Binder_restoreCallingIdentity }, 798727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick { "setThreadStrictModePolicy", "(I)V", (void*)android_os_Binder_setThreadStrictModePolicy }, 799727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick { "getThreadStrictModePolicy", "()I", (void*)android_os_Binder_getThreadStrictModePolicy }, 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "flushPendingCommands", "()V", (void*)android_os_Binder_flushPendingCommands }, 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "init", "()V", (void*)android_os_Binder_init }, 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "destroy", "()V", (void*)android_os_Binder_destroy } 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst char* const kBinderPathName = "android/os/Binder"; 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int int_register_android_os_Binder(JNIEnv* env) 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass clazz; 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clazz = env->FindClass(kBinderPathName); 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_FATAL_IF(clazz == NULL, "Unable to find class android.os.Binder"); 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderOffsets.mClass = (jclass) env->NewGlobalRef(clazz); 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderOffsets.mExecTransact 8168ab665dda40ab10e60fc69392022171f454af530Ashok Bhat = env->GetMethodID(clazz, "execTransact", "(IJJI)Z"); 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assert(gBinderOffsets.mExecTransact); 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderOffsets.mObject 8208ab665dda40ab10e60fc69392022171f454af530Ashok Bhat = env->GetFieldID(clazz, "mObject", "J"); 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assert(gBinderOffsets.mObject); 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AndroidRuntime::registerNativeMethods( 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env, kBinderPathName, 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderMethods, NELEM(gBinderMethods)); 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjint android_os_Debug_getLocalObjectCount(JNIEnv* env, jobject clazz) 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return gNumLocalRefs; 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjint android_os_Debug_getProxyObjectCount(JNIEnv* env, jobject clazz) 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return gNumProxyRefs; 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjint android_os_Debug_getDeathObjectCount(JNIEnv* env, jobject clazz) 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return gNumDeathRefs; 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jobject android_os_BinderInternal_getContextObject(JNIEnv* env, jobject clazz) 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IBinder> b = ProcessState::self()->getContextObject(NULL); 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return javaObjectForIBinder(env, b); 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_BinderInternal_joinThreadPool(JNIEnv* env, jobject clazz) 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IBinder> b = ProcessState::self()->getContextObject(NULL); 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android::IPCThreadState::self()->joinThreadPool(); 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 867887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackbornstatic void android_os_BinderInternal_disableBackgroundScheduling(JNIEnv* env, 868887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn jobject clazz, jboolean disable) 869887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn{ 870887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn IPCThreadState::disableBackgroundScheduling(disable ? true : false); 871887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn} 872887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_BinderInternal_handleGc(JNIEnv* env, jobject clazz) 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 87571f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("Gc has executed, clearing binder ops"); 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android_atomic_and(0, &gNumRefsCreated); 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const JNINativeMethod gBinderInternalMethods[] = { 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* name, signature, funcPtr */ 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "getContextObject", "()Landroid/os/IBinder;", (void*)android_os_BinderInternal_getContextObject }, 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "joinThreadPool", "()V", (void*)android_os_BinderInternal_joinThreadPool }, 885887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn { "disableBackgroundScheduling", "(Z)V", (void*)android_os_BinderInternal_disableBackgroundScheduling }, 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "handleGc", "()V", (void*)android_os_BinderInternal_handleGc } 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst char* const kBinderInternalPathName = "com/android/internal/os/BinderInternal"; 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int int_register_android_os_BinderInternal(JNIEnv* env) 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass clazz; 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clazz = env->FindClass(kBinderInternalPathName); 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_FATAL_IF(clazz == NULL, "Unable to find class com.android.internal.os.BinderInternal"); 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderInternalOffsets.mClass = (jclass) env->NewGlobalRef(clazz); 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderInternalOffsets.mForceGc 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = env->GetStaticMethodID(clazz, "forceBinderGc", "()V"); 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assert(gBinderInternalOffsets.mForceGc); 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AndroidRuntime::registerNativeMethods( 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env, kBinderInternalPathName, 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderInternalMethods, NELEM(gBinderInternalMethods)); 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_os_BinderProxy_pingBinder(JNIEnv* env, jobject obj) 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder* target = (IBinder*) 9158ab665dda40ab10e60fc69392022171f454af530Ashok Bhat env->GetLongField(obj, gBinderProxyOffsets.mObject); 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (target == NULL) { 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = target->pingBinder(); 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err == NO_ERROR ? JNI_TRUE : JNI_FALSE; 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jstring android_os_BinderProxy_getInterfaceDescriptor(JNIEnv* env, jobject obj) 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 9258ab665dda40ab10e60fc69392022171f454af530Ashok Bhat IBinder* target = (IBinder*) env->GetLongField(obj, gBinderProxyOffsets.mObject); 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (target != NULL) { 9272c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick const String16& desc = target->getInterfaceDescriptor(); 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return env->NewString(desc.string(), desc.size()); 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/RuntimeException", 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "No binder found for object"); 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_os_BinderProxy_isBinderAlive(JNIEnv* env, jobject obj) 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder* target = (IBinder*) 9388ab665dda40ab10e60fc69392022171f454af530Ashok Bhat env->GetLongField(obj, gBinderProxyOffsets.mObject); 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (target == NULL) { 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool alive = target->isBinderAlive(); 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return alive ? JNI_TRUE : JNI_FALSE; 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9462c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrickstatic int getprocname(pid_t pid, char *buf, size_t len) { 947ec3d44cc7e5308cbfb166166da939a5b5ad216bcSungmin Choi char filename[32]; 9482c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick FILE *f; 9492c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick 950ec3d44cc7e5308cbfb166166da939a5b5ad216bcSungmin Choi snprintf(filename, sizeof(filename), "/proc/%d/cmdline", pid); 9512c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick f = fopen(filename, "r"); 952ec3d44cc7e5308cbfb166166da939a5b5ad216bcSungmin Choi if (!f) { 953ec3d44cc7e5308cbfb166166da939a5b5ad216bcSungmin Choi *buf = '\0'; 954ec3d44cc7e5308cbfb166166da939a5b5ad216bcSungmin Choi return 1; 955ec3d44cc7e5308cbfb166166da939a5b5ad216bcSungmin Choi } 956ec3d44cc7e5308cbfb166166da939a5b5ad216bcSungmin Choi if (!fgets(buf, len, f)) { 957ec3d44cc7e5308cbfb166166da939a5b5ad216bcSungmin Choi *buf = '\0'; 958ec3d44cc7e5308cbfb166166da939a5b5ad216bcSungmin Choi fclose(f); 959ec3d44cc7e5308cbfb166166da939a5b5ad216bcSungmin Choi return 2; 960ec3d44cc7e5308cbfb166166da939a5b5ad216bcSungmin Choi } 9612c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick fclose(f); 9622c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick return 0; 9632c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick} 9642c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick 9652c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrickstatic bool push_eventlog_string(char** pos, const char* end, const char* str) { 9662c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick jint len = strlen(str); 9672c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick int space_needed = 1 + sizeof(len) + len; 9682c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick if (end - *pos < space_needed) { 9695b6da1aee884d32d8140e27c5b5b4d16ea4a37c8Mark Salyzyn ALOGW("not enough space for string. remain=%" PRIdPTR "; needed=%d", 970cfd91e7852bac3f9775cf3d05eedaade070cfecdMark Salyzyn end - *pos, space_needed); 9712c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick return false; 9722c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick } 9732c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick **pos = EVENT_TYPE_STRING; 9742c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick (*pos)++; 9752c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick memcpy(*pos, &len, sizeof(len)); 9762c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick *pos += sizeof(len); 9772c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick memcpy(*pos, str, len); 9782c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick *pos += len; 9792c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick return true; 9802c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick} 9812c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick 9822c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrickstatic bool push_eventlog_int(char** pos, const char* end, jint val) { 9832c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick int space_needed = 1 + sizeof(val); 9842c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick if (end - *pos < space_needed) { 9855b6da1aee884d32d8140e27c5b5b4d16ea4a37c8Mark Salyzyn ALOGW("not enough space for int. remain=%" PRIdPTR "; needed=%d", 986cfd91e7852bac3f9775cf3d05eedaade070cfecdMark Salyzyn end - *pos, space_needed); 9872c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick return false; 9882c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick } 9892c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick **pos = EVENT_TYPE_INT; 9902c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick (*pos)++; 9912c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick memcpy(*pos, &val, sizeof(val)); 9922c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick *pos += sizeof(val); 9932c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick return true; 9942c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick} 9952c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick 9962c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick// From frameworks/base/core/java/android/content/EventLogTags.logtags: 9972b4d22cda3c44f5d731c15306b85045417071408Jeff Sharkey#define ENABLE_BINDER_SAMPLE 0 9982c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick#define LOGTAG_BINDER_OPERATION 52004 9992c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick 10002c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrickstatic void conditionally_log_binder_call(int64_t start_millis, 10012c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick IBinder* target, jint code) { 10022c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick int duration_ms = static_cast<int>(uptimeMillis() - start_millis); 10032c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick 10042c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick int sample_percent; 10052c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick if (duration_ms >= 500) { 10062c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick sample_percent = 100; 10072c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick } else { 10082c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick sample_percent = 100 * duration_ms / 500; 10092c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick if (sample_percent == 0) { 10102c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick return; 10112c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick } 10122c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick if (sample_percent < (random() % 100 + 1)) { 10132c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick return; 10142c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick } 10152c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick } 10162c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick 10172c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick char process_name[40]; 10182c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick getprocname(getpid(), process_name, sizeof(process_name)); 10192c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick String8 desc(target->getInterfaceDescriptor()); 10202c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick 10212c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick char buf[LOGGER_ENTRY_MAX_PAYLOAD]; 10222c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick buf[0] = EVENT_TYPE_LIST; 10232c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick buf[1] = 5; 10242c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick char* pos = &buf[2]; 10252c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick char* end = &buf[LOGGER_ENTRY_MAX_PAYLOAD - 1]; // leave room for final \n 10262c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick if (!push_eventlog_string(&pos, end, desc.string())) return; 10272c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick if (!push_eventlog_int(&pos, end, code)) return; 10282c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick if (!push_eventlog_int(&pos, end, duration_ms)) return; 10292c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick if (!push_eventlog_string(&pos, end, process_name)) return; 10302c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick if (!push_eventlog_int(&pos, end, sample_percent)) return; 10312c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick *(pos++) = '\n'; // conventional with EVENT_TYPE_LIST apparently. 10322c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick android_bWriteLog(LOGTAG_BINDER_OPERATION, buf, pos - buf); 10332c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick} 10342c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick 1035ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick// We only measure binder call durations to potentially log them if 1036ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick// we're on the main thread. Unfortunately sim-eng doesn't seem to 1037ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick// have gettid, so we just ignore this and don't log if we can't 1038ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick// get the thread id. 1039ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrickstatic bool should_time_binder_calls() { 10405348c014129b766d621ef82a6e42007009ffc310Brad Fitzpatrick#ifdef HAVE_GETTID 10415348c014129b766d621ef82a6e42007009ffc310Brad Fitzpatrick return (getpid() == androidGetTid()); 1042ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick#else 1043ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick#warning no gettid(), so not logging Binder calls... 1044ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick return false; 1045ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick#endif 1046ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick} 1047ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_os_BinderProxy_transact(JNIEnv* env, jobject obj, 10490bde66a837542e5bd901d8b8e47c5bd7c4c99fe4Jeff Brown jint code, jobject dataObj, jobject replyObj, jint flags) // throws RemoteException 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dataObj == NULL) { 105269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes jniThrowNullPointerException(env, NULL); 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* data = parcelForJavaObject(env, dataObj); 10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (data == NULL) { 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* reply = parcelForJavaObject(env, replyObj); 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (reply == NULL && replyObj != NULL) { 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder* target = (IBinder*) 10668ab665dda40ab10e60fc69392022171f454af530Ashok Bhat env->GetLongField(obj, gBinderProxyOffsets.mObject); 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (target == NULL) { 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", "Binder has been finalized!"); 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1072cfd91e7852bac3f9775cf3d05eedaade070cfecdMark Salyzyn ALOGV("Java code calling transact on %p in Java object %p with code %" PRId32 "\n", 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project target, obj, code); 10742c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick 10752b4d22cda3c44f5d731c15306b85045417071408Jeff Sharkey#if ENABLE_BINDER_SAMPLE 10762c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick // Only log the binder call duration for things on the Java-level main thread. 1077ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick // But if we don't 1078ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick const bool time_binder_calls = should_time_binder_calls(); 1079ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick 10802c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick int64_t start_millis; 1081ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick if (time_binder_calls) { 10822c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick start_millis = uptimeMillis(); 10832c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick } 10842b4d22cda3c44f5d731c15306b85045417071408Jeff Sharkey#endif 10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("Transact from Java code to %p sending: ", target); data->print(); 10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = target->transact(code, *data, reply, flags); 10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //if (reply) printf("Transact from Java code to %p received: ", target); reply->print(); 10882b4d22cda3c44f5d731c15306b85045417071408Jeff Sharkey#if ENABLE_BINDER_SAMPLE 1089ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick if (time_binder_calls) { 10902c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick conditionally_log_binder_call(start_millis, target, code); 10912c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick } 10922b4d22cda3c44f5d731c15306b85045417071408Jeff Sharkey#endif 10932c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err == NO_ERROR) { 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_TRUE; 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (err == UNKNOWN_TRANSACTION) { 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11000bde66a837542e5bd901d8b8e47c5bd7c4c99fe4Jeff Brown signalExceptionForError(env, obj, err, true /*canThrowRemoteException*/); 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_BinderProxy_linkToDeath(JNIEnv* env, jobject obj, 11050bde66a837542e5bd901d8b8e47c5bd7c4c99fe4Jeff Brown jobject recipient, jint flags) // throws RemoteException 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (recipient == NULL) { 110869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes jniThrowNullPointerException(env, NULL); 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder* target = (IBinder*) 11138ab665dda40ab10e60fc69392022171f454af530Ashok Bhat env->GetLongField(obj, gBinderProxyOffsets.mObject); 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (target == NULL) { 11158564c8da817a845353d213acd8636b76f567b234Steve Block ALOGW("Binder has been finalized when calling linkToDeath() with recip=%p)\n", recipient); 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assert(false); 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 111979dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate LOGDEATH("linkToDeath: binder=%p recipient=%p\n", target, recipient); 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!target->localBinder()) { 1122bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate DeathRecipientList* list = (DeathRecipientList*) 11238ab665dda40ab10e60fc69392022171f454af530Ashok Bhat env->GetLongField(obj, gBinderProxyOffsets.mOrgue); 1124bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate sp<JavaDeathRecipient> jdr = new JavaDeathRecipient(env, recipient, list); 11250b41448506610f73302cc631677823fd8b865ea5Christopher Tate status_t err = target->linkToDeath(jdr, NULL, flags); 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Failure adding the death recipient, so clear its reference 11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // now. 11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jdr->clearReference(); 11300bde66a837542e5bd901d8b8e47c5bd7c4c99fe4Jeff Brown signalExceptionForError(env, obj, err, true /*canThrowRemoteException*/); 11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_os_BinderProxy_unlinkToDeath(JNIEnv* env, jobject obj, 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject recipient, jint flags) 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jboolean res = JNI_FALSE; 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (recipient == NULL) { 114069a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes jniThrowNullPointerException(env, NULL); 11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder* target = (IBinder*) 11458ab665dda40ab10e60fc69392022171f454af530Ashok Bhat env->GetLongField(obj, gBinderProxyOffsets.mObject); 11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (target == NULL) { 11478564c8da817a845353d213acd8636b76f567b234Steve Block ALOGW("Binder has been finalized when calling linkToDeath() with recip=%p)\n", recipient); 11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 115179dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate LOGDEATH("unlinkToDeath: binder=%p recipient=%p\n", target, recipient); 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!target->localBinder()) { 11540b41448506610f73302cc631677823fd8b865ea5Christopher Tate status_t err = NAME_NOT_FOUND; 1155bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate 1156bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate // If we find the matching recipient, proceed to unlink using that 1157bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate DeathRecipientList* list = (DeathRecipientList*) 11588ab665dda40ab10e60fc69392022171f454af530Ashok Bhat env->GetLongField(obj, gBinderProxyOffsets.mOrgue); 1159bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate sp<JavaDeathRecipient> origJDR = list->find(recipient); 116079dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate LOGDEATH(" unlink found list %p and JDR %p", list, origJDR.get()); 11610b41448506610f73302cc631677823fd8b865ea5Christopher Tate if (origJDR != NULL) { 11620b41448506610f73302cc631677823fd8b865ea5Christopher Tate wp<IBinder::DeathRecipient> dr; 11630b41448506610f73302cc631677823fd8b865ea5Christopher Tate err = target->unlinkToDeath(origJDR, NULL, flags, &dr); 11640b41448506610f73302cc631677823fd8b865ea5Christopher Tate if (err == NO_ERROR && dr != NULL) { 11650b41448506610f73302cc631677823fd8b865ea5Christopher Tate sp<IBinder::DeathRecipient> sdr = dr.promote(); 11660b41448506610f73302cc631677823fd8b865ea5Christopher Tate JavaDeathRecipient* jdr = static_cast<JavaDeathRecipient*>(sdr.get()); 11670b41448506610f73302cc631677823fd8b865ea5Christopher Tate if (jdr != NULL) { 11680b41448506610f73302cc631677823fd8b865ea5Christopher Tate jdr->clearReference(); 11690b41448506610f73302cc631677823fd8b865ea5Christopher Tate } 11700b41448506610f73302cc631677823fd8b865ea5Christopher Tate } 11710b41448506610f73302cc631677823fd8b865ea5Christopher Tate } 11720b41448506610f73302cc631677823fd8b865ea5Christopher Tate 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err == NO_ERROR || err == DEAD_OBJECT) { 11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res = JNI_TRUE; 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/util/NoSuchElementException", 11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Death link does not exist"); 11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_BinderProxy_destroy(JNIEnv* env, jobject obj) 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder* b = (IBinder*) 11878ab665dda40ab10e60fc69392022171f454af530Ashok Bhat env->GetLongField(obj, gBinderProxyOffsets.mObject); 1188bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate DeathRecipientList* drl = (DeathRecipientList*) 11898ab665dda40ab10e60fc69392022171f454af530Ashok Bhat env->GetLongField(obj, gBinderProxyOffsets.mOrgue); 1190bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate 119179dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate LOGDEATH("Destroying BinderProxy %p: binder=%p drl=%p\n", obj, b, drl); 11928ab665dda40ab10e60fc69392022171f454af530Ashok Bhat env->SetLongField(obj, gBinderProxyOffsets.mObject, 0); 11938ab665dda40ab10e60fc69392022171f454af530Ashok Bhat env->SetLongField(obj, gBinderProxyOffsets.mOrgue, 0); 1194bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate drl->decStrong((void*)javaObjectForIBinder); 1195b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopian b->decStrong((void*)javaObjectForIBinder); 11960b41448506610f73302cc631677823fd8b865ea5Christopher Tate 1197bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate IPCThreadState::self()->flushCommands(); 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const JNINativeMethod gBinderProxyMethods[] = { 12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* name, signature, funcPtr */ 12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"pingBinder", "()Z", (void*)android_os_BinderProxy_pingBinder}, 12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"isBinderAlive", "()Z", (void*)android_os_BinderProxy_isBinderAlive}, 12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"getInterfaceDescriptor", "()Ljava/lang/String;", (void*)android_os_BinderProxy_getInterfaceDescriptor}, 12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"transact", "(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z", (void*)android_os_BinderProxy_transact}, 12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"linkToDeath", "(Landroid/os/IBinder$DeathRecipient;I)V", (void*)android_os_BinderProxy_linkToDeath}, 12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"unlinkToDeath", "(Landroid/os/IBinder$DeathRecipient;I)Z", (void*)android_os_BinderProxy_unlinkToDeath}, 12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"destroy", "()V", (void*)android_os_BinderProxy_destroy}, 12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst char* const kBinderProxyPathName = "android/os/BinderProxy"; 12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int int_register_android_os_BinderProxy(JNIEnv* env) 12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass clazz; 12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clazz = env->FindClass("java/lang/Error"); 12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_FATAL_IF(clazz == NULL, "Unable to find class java.lang.Error"); 12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gErrorOffsets.mClass = (jclass) env->NewGlobalRef(clazz); 122269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clazz = env->FindClass(kBinderProxyPathName); 12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_FATAL_IF(clazz == NULL, "Unable to find class android.os.BinderProxy"); 12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderProxyOffsets.mClass = (jclass) env->NewGlobalRef(clazz); 12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderProxyOffsets.mConstructor 12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = env->GetMethodID(clazz, "<init>", "()V"); 12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assert(gBinderProxyOffsets.mConstructor); 12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderProxyOffsets.mSendDeathNotice 12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = env->GetStaticMethodID(clazz, "sendDeathNotice", "(Landroid/os/IBinder$DeathRecipient;)V"); 12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assert(gBinderProxyOffsets.mSendDeathNotice); 12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderProxyOffsets.mObject 12358ab665dda40ab10e60fc69392022171f454af530Ashok Bhat = env->GetFieldID(clazz, "mObject", "J"); 12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assert(gBinderProxyOffsets.mObject); 12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderProxyOffsets.mSelf 12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = env->GetFieldID(clazz, "mSelf", "Ljava/lang/ref/WeakReference;"); 12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assert(gBinderProxyOffsets.mSelf); 1240bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate gBinderProxyOffsets.mOrgue 12418ab665dda40ab10e60fc69392022171f454af530Ashok Bhat = env->GetFieldID(clazz, "mOrgue", "J"); 1242bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate assert(gBinderProxyOffsets.mOrgue); 12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12440d4a792e8d5ebfd182acc8db7cd9b40f3bc51640Christopher Tate clazz = env->FindClass("java/lang/Class"); 12450d4a792e8d5ebfd182acc8db7cd9b40f3bc51640Christopher Tate LOG_FATAL_IF(clazz == NULL, "Unable to find java.lang.Class"); 12460d4a792e8d5ebfd182acc8db7cd9b40f3bc51640Christopher Tate gClassOffsets.mGetName = env->GetMethodID(clazz, "getName", "()Ljava/lang/String;"); 12470d4a792e8d5ebfd182acc8db7cd9b40f3bc51640Christopher Tate assert(gClassOffsets.mGetName); 12480d4a792e8d5ebfd182acc8db7cd9b40f3bc51640Christopher Tate 12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AndroidRuntime::registerNativeMethods( 12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env, kBinderProxyPathName, 12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderProxyMethods, NELEM(gBinderProxyMethods)); 12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1258d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkeyint register_android_os_Binder(JNIEnv* env) 12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1260d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (int_register_android_os_Binder(env) < 0) 1261d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return -1; 1262d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (int_register_android_os_BinderInternal(env) < 0) 1263d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return -1; 1264d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (int_register_android_os_BinderProxy(env) < 0) 1265d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return -1; 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass clazz; 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clazz = env->FindClass("android/util/Log"); 12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_FATAL_IF(clazz == NULL, "Unable to find class android.util.Log"); 12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gLogOffsets.mClass = (jclass) env->NewGlobalRef(clazz); 12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gLogOffsets.mLogE = env->GetStaticMethodID( 12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clazz, "e", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I"); 12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assert(gLogOffsets.mLogE); 12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clazz = env->FindClass("android/os/ParcelFileDescriptor"); 12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_FATAL_IF(clazz == NULL, "Unable to find class android.os.ParcelFileDescriptor"); 12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gParcelFileDescriptorOffsets.mClass = (jclass) env->NewGlobalRef(clazz); 12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gParcelFileDescriptorOffsets.mConstructor 12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = env->GetMethodID(clazz, "<init>", "(Ljava/io/FileDescriptor;)V"); 12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1282727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick clazz = env->FindClass("android/os/StrictMode"); 1283727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick LOG_FATAL_IF(clazz == NULL, "Unable to find class android.os.StrictMode"); 1284727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick gStrictModeCallbackOffsets.mClass = (jclass) env->NewGlobalRef(clazz); 1285727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick gStrictModeCallbackOffsets.mCallback = env->GetStaticMethodID( 1286727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick clazz, "onBinderStrictModePolicyChange", "(I)V"); 1287727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick LOG_FATAL_IF(gStrictModeCallbackOffsets.mCallback == NULL, 1288727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick "Unable to find strict mode callback."); 1289727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick 12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1292