android_os_HwParcel.cpp revision 9f0268695c046538a1887f54172454dbc89157e7
1dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber/* 2dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * Copyright (C) 2016 The Android Open Source Project 3dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * 4dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * you may not use this file except in compliance with the License. 6dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * You may obtain a copy of the License at 7dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * 8dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * 10dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * Unless required by applicable law or agreed to in writing, software 11dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * See the License for the specific language governing permissions and 14dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * limitations under the License. 15dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber */ 16dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 17dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber//#define LOG_NDEBUG 0 18dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber#define LOG_TAG "android_os_HwParcel" 19dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber#include <android-base/logging.h> 20dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 21dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber#include "android_os_HwParcel.h" 22dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 23dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber#include "android_os_HwBinder.h" 249266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber#include "android_os_HwBlob.h" 25dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber#include "android_os_HwRemoteBinder.h" 26dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 27dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber#include <JNIHelp.h> 28dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber#include <android_runtime/AndroidRuntime.h> 29aa2c32f92b199cb40b808554ced67af1edaffef5Martijn Coenen#include <hidl/Status.h> 30dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber#include <nativehelper/ScopedLocalRef.h> 31dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 32dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber#include "core_jni_helpers.h" 33dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 34dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberusing android::AndroidRuntime; 35dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 36dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberusing ::android::hardware::hidl_string; 37dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberusing ::android::hardware::hidl_vec; 38dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 39dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber#define PACKAGE_PATH "android/os" 40dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber#define CLASS_NAME "HwParcel" 41dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber#define CLASS_PATH PACKAGE_PATH "/" CLASS_NAME 42dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 43dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Hubernamespace android { 44dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 45dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic struct fields_t { 46dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber jfieldID contextID; 47dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber jmethodID constructID; 48dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 49dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber} gFields; 50dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 51dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Hubervoid signalExceptionForError(JNIEnv *env, status_t err) { 52dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber switch (err) { 53dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber case OK: 54dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber break; 55dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 56dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber case NO_MEMORY: 57dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber { 58dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber jniThrowException(env, "java/lang/OutOfMemoryError", NULL); 59dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber break; 60dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber } 61dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 62dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber case INVALID_OPERATION: 63dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber { 64dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber jniThrowException( 65dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber env, "java/lang/UnsupportedOperationException", NULL); 66dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber break; 67dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber } 68dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 69dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber case BAD_VALUE: 70dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber { 71dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 72dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber break; 73dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber } 74dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 759266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber case -ERANGE: 76dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber case BAD_INDEX: 77dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber { 78dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber jniThrowException(env, "java/lang/IndexOutOfBoundsException", NULL); 79dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber break; 80dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber } 81dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 82dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber case BAD_TYPE: 83dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber { 84dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 85dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber break; 86dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber } 87dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 88dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber case NAME_NOT_FOUND: 89dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber { 90dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber jniThrowException(env, "java/util/NoSuchElementException", NULL); 91dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber break; 92dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber } 93dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 94dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber case PERMISSION_DENIED: 95dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber { 96dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber jniThrowException(env, "java/lang/SecurityException", NULL); 97dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber break; 98dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber } 99dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 100dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber case NO_INIT: 101dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber { 102dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber jniThrowException( 103dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber env, "java/lang/RuntimeException", "Not initialized"); 104dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber break; 105dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber } 106dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 107dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber case ALREADY_EXISTS: 108dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber { 109dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber jniThrowException( 110dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber env, "java/lang/RuntimeException", "Item already exists"); 111dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber break; 112dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber } 113dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 114dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber default: 115dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber { 116dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber jniThrowException( 117dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber env, "java/lang/RuntimeException", "Unknown error"); 118dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 119dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber break; 120dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber } 121dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber } 122dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber} 123dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 124dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber// static 125dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Hubervoid JHwParcel::InitClass(JNIEnv *env) { 126dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber ScopedLocalRef<jclass> clazz( 127dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber env, FindClassOrDie(env, CLASS_PATH)); 128dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 129dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber gFields.contextID = 130dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber GetFieldIDOrDie(env, clazz.get(), "mNativeContext", "J"); 131dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 132dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber gFields.constructID = GetMethodIDOrDie(env, clazz.get(), "<init>", "(Z)V"); 133dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber} 134dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 135dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber// static 136dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Hubersp<JHwParcel> JHwParcel::SetNativeContext( 137dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber JNIEnv *env, jobject thiz, const sp<JHwParcel> &context) { 138dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber sp<JHwParcel> old = (JHwParcel *)env->GetLongField(thiz, gFields.contextID); 139dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 140dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber if (context != NULL) { 141dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber context->incStrong(NULL /* id */); 142dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber } 143dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 144dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber if (old != NULL) { 145dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber old->decStrong(NULL /* id */); 146dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber } 147dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 148dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber env->SetLongField(thiz, gFields.contextID, (long)context.get()); 149dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 150dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber return old; 151dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber} 152dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 153dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber// static 154dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Hubersp<JHwParcel> JHwParcel::GetNativeContext(JNIEnv *env, jobject thiz) { 155dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber return (JHwParcel *)env->GetLongField(thiz, gFields.contextID); 156dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber} 157dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 158dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberJHwParcel::JHwParcel(JNIEnv *env, jobject thiz) 159dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber : mParcel(NULL), 160dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber mOwnsParcel(false), 161dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber mTransactCallback(nullptr), 162dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber mWasSent(false) { 163dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber jclass clazz = env->GetObjectClass(thiz); 164dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber CHECK(clazz != NULL); 165dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 166dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber mClass = (jclass)env->NewGlobalRef(clazz); 167dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber mObject = env->NewWeakGlobalRef(thiz); 168dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber} 169dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 170dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberJHwParcel::~JHwParcel() { 171dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber JNIEnv *env = AndroidRuntime::getJNIEnv(); 172dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 173dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber mStorage.release(env); 174dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 175dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber setParcel(NULL, false /* assumeOwnership */); 176dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 177dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber env->DeleteWeakGlobalRef(mObject); 178dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber mObject = NULL; 179dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 180dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber env->DeleteGlobalRef(mClass); 181dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber mClass = NULL; 182dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber} 183dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 184dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberhardware::Parcel *JHwParcel::getParcel() { 185dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber return mParcel; 186dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber} 187dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 188dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberEphemeralStorage *JHwParcel::getStorage() { 189dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber return &mStorage; 190dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber} 191dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 192dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Hubervoid JHwParcel::setParcel(hardware::Parcel *parcel, bool assumeOwnership) { 193dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber if (mParcel && mOwnsParcel) { 194dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber delete mParcel; 195dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber } 196dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 197dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber mParcel = parcel; 198dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber mOwnsParcel = assumeOwnership; 199dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber} 200dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 201dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber// static 202dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberjobject JHwParcel::NewObject(JNIEnv *env) { 203dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber ScopedLocalRef<jclass> clazz(env, FindClassOrDie(env, CLASS_PATH)); 204dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 2059266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber jmethodID constructID = 2069266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber GetMethodIDOrDie(env, clazz.get(), "<init>", "(Z)V"); 2079266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber 2089266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber return env->NewObject(clazz.get(), constructID, false /* allocate */); 209dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber} 210dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 211dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Hubervoid JHwParcel::setTransactCallback( 212dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber ::android::hardware::IBinder::TransactCallback cb) { 213dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber mTransactCallback = cb; 214dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber} 215dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 216dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Hubervoid JHwParcel::send() { 217dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber CHECK(mTransactCallback != nullptr); 218dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber CHECK(mParcel != nullptr); 219dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 220dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber mTransactCallback(*mParcel); 221dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber mTransactCallback = nullptr; 222dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 223dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber mWasSent = true; 224dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber} 225dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 226dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberbool JHwParcel::wasSent() const { 227dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber return mWasSent; 228dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber} 229dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 230dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber} // namespace android 231dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 232dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber//////////////////////////////////////////////////////////////////////////////// 233dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 234dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberusing namespace android; 235dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 236dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic void releaseNativeContext(void *nativeContext) { 237dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber sp<JHwParcel> parcel = (JHwParcel *)nativeContext; 238dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 239dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber if (parcel != NULL) { 240dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber parcel->decStrong(NULL /* id */); 241dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber } 242dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber} 243dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 244dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic jlong JHwParcel_native_init(JNIEnv *env) { 245dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber JHwParcel::InitClass(env); 246dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 247dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber return reinterpret_cast<jlong>(&releaseNativeContext); 248dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber} 249dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 250dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic void JHwParcel_native_setup( 251dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber JNIEnv *env, jobject thiz, jboolean allocate) { 252dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber sp<JHwParcel> context = new JHwParcel(env, thiz); 253dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 254dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber if (allocate) { 255dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber context->setParcel(new hardware::Parcel, true /* assumeOwnership */); 256dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber } 257dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 258dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber JHwParcel::SetNativeContext(env, thiz, context); 259dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber} 260dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 261dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic void JHwParcel_native_writeInterfaceToken( 262dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber JNIEnv *env, jobject thiz, jstring interfaceNameObj) { 263dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber if (interfaceNameObj == NULL) { 264dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber jniThrowException(env, "java/lang/NullPointerException", NULL); 265dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber return; 266dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber } 267dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 268dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber const jchar *interfaceName = env->GetStringCritical(interfaceNameObj, NULL); 269dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber if (interfaceName) { 2709f0268695c046538a1887f54172454dbc89157e7Andreas Huber String16 nameCopy( 2719f0268695c046538a1887f54172454dbc89157e7Andreas Huber reinterpret_cast<const char16_t *>(interfaceName), 2729f0268695c046538a1887f54172454dbc89157e7Andreas Huber env->GetStringLength(interfaceNameObj)); 273dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 274dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber env->ReleaseStringCritical(interfaceNameObj, interfaceName); 275dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber interfaceName = NULL; 276dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 2779f0268695c046538a1887f54172454dbc89157e7Andreas Huber hardware::Parcel *parcel = 2789f0268695c046538a1887f54172454dbc89157e7Andreas Huber JHwParcel::GetNativeContext(env, thiz)->getParcel(); 2799f0268695c046538a1887f54172454dbc89157e7Andreas Huber 2809f0268695c046538a1887f54172454dbc89157e7Andreas Huber status_t err = parcel->writeInterfaceToken(nameCopy); 281dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber signalExceptionForError(env, err); 282dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber } 283dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber} 284dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 285dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic void JHwParcel_native_enforceInterface( 286dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber JNIEnv *env, jobject thiz, jstring interfaceNameObj) { 287dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber // XXX original binder Parcel enforceInterface implementation does some 288dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber // mysterious things regarding strictModePolicy(), figure out if we need 289dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber // that here as well. 290dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber if (interfaceNameObj == NULL) { 291dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber jniThrowException(env, "java/lang/NullPointerException", NULL); 292dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber return; 293dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber } 294dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 295dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber const jchar *interfaceName = env->GetStringCritical(interfaceNameObj, NULL); 296dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber if (interfaceName) { 2979f0268695c046538a1887f54172454dbc89157e7Andreas Huber String16 interfaceNameCopy( 2989f0268695c046538a1887f54172454dbc89157e7Andreas Huber reinterpret_cast<const char16_t *>(interfaceName), 2999f0268695c046538a1887f54172454dbc89157e7Andreas Huber env->GetStringLength(interfaceNameObj)); 300dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 301dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber env->ReleaseStringCritical(interfaceNameObj, interfaceName); 302dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber interfaceName = NULL; 303dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 3049f0268695c046538a1887f54172454dbc89157e7Andreas Huber hardware::Parcel *parcel = 3059f0268695c046538a1887f54172454dbc89157e7Andreas Huber JHwParcel::GetNativeContext(env, thiz)->getParcel(); 3069f0268695c046538a1887f54172454dbc89157e7Andreas Huber 3079f0268695c046538a1887f54172454dbc89157e7Andreas Huber bool valid = parcel->enforceInterface(interfaceNameCopy); 3089f0268695c046538a1887f54172454dbc89157e7Andreas Huber 309dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber if (!valid) { 310dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber jniThrowException( 311dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber env, 312dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber "java/lang/SecurityException", 313dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber "HWBinder invocation to an incorrect interface"); 314dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber } 315dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber } 316dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber} 317dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 318dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber#define DEFINE_PARCEL_WRITER(Suffix,Type) \ 319dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic void JHwParcel_native_write ## Suffix( \ 320dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber JNIEnv *env, jobject thiz, Type val) { \ 321dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber hardware::Parcel *parcel = \ 322dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber JHwParcel::GetNativeContext(env, thiz)->getParcel(); \ 323dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber \ 324dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber status_t err = parcel->write ## Suffix(val); \ 325dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber signalExceptionForError(env, err); \ 326dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber} 327dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 328dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber#define DEFINE_PARCEL_READER(Suffix,Type) \ 329dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic Type JHwParcel_native_read ## Suffix( \ 330dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber JNIEnv *env, jobject thiz) { \ 331dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber hardware::Parcel *parcel = \ 332dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber JHwParcel::GetNativeContext(env, thiz)->getParcel(); \ 333dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber \ 334dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber Type val; \ 335dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber status_t err = parcel->read ## Suffix(&val); \ 336dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber signalExceptionForError(env, err); \ 337dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber \ 338dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber return val; \ 339dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber} 340dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 34186635bb45ee1ddeb3059a8a925659964c7858cc3Andreas HuberDEFINE_PARCEL_WRITER(Bool,jboolean) 342dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_WRITER(Int8,jbyte) 343dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_WRITER(Int16,jshort) 344dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_WRITER(Int32,jint) 345dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_WRITER(Int64,jlong) 346dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_WRITER(Float,jfloat) 347dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_WRITER(Double,jdouble) 348dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 349dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_READER(Int8,jbyte) 350dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_READER(Int16,jshort) 351dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_READER(Int32,jint) 352dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_READER(Int64,jlong) 353dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_READER(Float,jfloat) 354dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_READER(Double,jdouble) 355dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 35686635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huberstatic jboolean JHwParcel_native_readBool(JNIEnv *env, jobject thiz) { 35786635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber hardware::Parcel *parcel = 35886635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber JHwParcel::GetNativeContext(env, thiz)->getParcel(); 35986635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber 36086635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber bool val; 36186635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber status_t err = parcel->readBool(&val); 36286635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber signalExceptionForError(env, err); 36386635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber 36486635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber return (jboolean)val; 36586635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber} 36686635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber 367dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic void JHwParcel_native_writeStatus( 368dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber JNIEnv *env, jobject thiz, jint statusCode) { 369dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber using hardware::Status; 370dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 371dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber Status status; 372dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber switch (statusCode) { 373dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber case 0: // kStatusSuccess 374dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber status = Status::ok(); 375dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber break; 376dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber case -1: // kStatusError 377dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber status = Status::fromStatusT(UNKNOWN_ERROR); 378dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber break; 379dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber default: 380dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber CHECK(!"Should not be here"); 381dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber } 382dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 383dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber hardware::Parcel *parcel = 384dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber JHwParcel::GetNativeContext(env, thiz)->getParcel(); 385dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 386dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber status_t err = status.writeToParcel(parcel); 387dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber signalExceptionForError(env, err); 388dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber} 389dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 390dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic void JHwParcel_native_verifySuccess(JNIEnv *env, jobject thiz) { 391dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber using hardware::Status; 392dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 393dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber hardware::Parcel *parcel = 394dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber JHwParcel::GetNativeContext(env, thiz)->getParcel(); 395dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 396dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber Status status; 397dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber status_t err = status.readFromParcel(*parcel); 398dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber signalExceptionForError(env, err); 399dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber} 400dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 401dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic void JHwParcel_native_releaseTemporaryStorage( 402dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber JNIEnv *env, jobject thiz) { 403dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber JHwParcel::GetNativeContext(env, thiz)->getStorage()->release(env); 404dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber} 405dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 406dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic void JHwParcel_native_send(JNIEnv *env, jobject thiz) { 407dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber JHwParcel::GetNativeContext(env, thiz)->send(); 408dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber} 409dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 410dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic void JHwParcel_native_writeString( 411dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber JNIEnv *env, jobject thiz, jstring valObj) { 412dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber if (valObj == NULL) { 413dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber jniThrowException(env, "java/lang/NullPointerException", NULL); 414dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber return; 415dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber } 416dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 417dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber sp<JHwParcel> impl = JHwParcel::GetNativeContext(env, thiz); 418dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 419dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber const hidl_string *s = 420dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber impl->getStorage()->allocTemporaryString(env, valObj); 421dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 422dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber hardware::Parcel *parcel = impl->getParcel(); 423dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 424dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber size_t parentHandle; 425dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber status_t err = parcel->writeBuffer(s, sizeof(*s), &parentHandle); 426dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 427dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber if (err == OK) { 428dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber err = s->writeEmbeddedToParcel( 429dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber parcel, parentHandle, 0 /* parentOffset */); 430dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber } 431dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 432dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber signalExceptionForError(env, err); 433dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber} 434dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 435dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber#define DEFINE_PARCEL_VECTOR_WRITER(Suffix,Type) \ 436dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic void JHwParcel_native_write ## Suffix ## Vector( \ 437dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber JNIEnv *env, jobject thiz, Type ## Array valObj) { \ 438dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber if (valObj == NULL) { \ 439dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber jniThrowException(env, "java/lang/NullPointerException", NULL); \ 440dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber return; \ 441dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber } \ 442dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber \ 443dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber sp<JHwParcel> impl = JHwParcel::GetNativeContext(env, thiz); \ 444dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber \ 445dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber const hidl_vec<Type> *vec = \ 446dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber impl->getStorage()->allocTemporary ## Suffix ## Vector(env, valObj); \ 447dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber \ 448dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber hardware::Parcel *parcel = impl->getParcel(); \ 449dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber \ 450dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber size_t parentHandle; \ 451dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber status_t err = parcel->writeBuffer(vec, sizeof(*vec), &parentHandle); \ 452dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber \ 453dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber if (err == OK) { \ 454dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber size_t childHandle; \ 455dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber \ 456dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber err = vec->writeEmbeddedToParcel( \ 457dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber parcel, \ 458dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber parentHandle, \ 459dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 0 /* parentOffset */, \ 460dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber &childHandle); \ 461dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber } \ 462dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber \ 463dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber signalExceptionForError(env, err); \ 464dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber} 465dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 466dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_VECTOR_WRITER(Int8,jbyte) 467dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_VECTOR_WRITER(Int16,jshort) 468dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_VECTOR_WRITER(Int32,jint) 469dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_VECTOR_WRITER(Int64,jlong) 470dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_VECTOR_WRITER(Float,jfloat) 471dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_VECTOR_WRITER(Double,jdouble) 472dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 47386635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huberstatic void JHwParcel_native_writeBoolVector( 47486635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber JNIEnv *env, jobject thiz, jbooleanArray valObj) { 47586635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber if (valObj == NULL) { 47686635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber jniThrowException(env, "java/lang/NullPointerException", NULL); 47786635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber return; 47886635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber } 47986635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber 48086635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber sp<JHwParcel> impl = JHwParcel::GetNativeContext(env, thiz); 48186635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber 4829266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber void *vecPtr = 4839266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber impl->getStorage()->allocTemporaryStorage(sizeof(hidl_vec<bool>)); 4849266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber 4859266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber hidl_vec<bool> *vec = new (vecPtr) hidl_vec<bool>; 48686635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber 48786635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber jsize len = env->GetArrayLength(valObj); 48886635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber 48986635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber jboolean *src = env->GetBooleanArrayElements(valObj, nullptr); 49086635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber 49186635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber bool *dst = 49286635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber (bool *)impl->getStorage()->allocTemporaryStorage(len * sizeof(bool)); 49386635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber 49486635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber for (jsize i = 0; i < len; ++i) { 49586635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber dst[i] = src[i]; 49686635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber } 49786635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber 49886635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber env->ReleaseBooleanArrayElements(valObj, src, 0 /* mode */); 49986635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber src = nullptr; 50086635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber 50186635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber vec->setToExternal(dst, len); 50286635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber 50386635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber hardware::Parcel *parcel = impl->getParcel(); 50486635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber 50586635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber size_t parentHandle; 50686635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber status_t err = parcel->writeBuffer(vec, sizeof(*vec), &parentHandle); 50786635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber 50886635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber if (err == OK) { 50986635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber size_t childHandle; 51086635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber 51186635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber err = vec->writeEmbeddedToParcel( 51286635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber parcel, 51386635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber parentHandle, 51486635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber 0 /* parentOffset */, 51586635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber &childHandle); 51686635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber } 51786635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber 51886635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber signalExceptionForError(env, err); 51986635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber} 52086635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber 521dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic void JHwParcel_native_writeStrongBinder( 522dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber JNIEnv *env, jobject thiz, jobject binderObj) { 523dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber sp<hardware::IBinder> binder; 524dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber if (binderObj != NULL) { 525dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber ScopedLocalRef<jclass> hwBinderKlass( 526dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber env, FindClassOrDie(env, PACKAGE_PATH "/HwBinder")); 527dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 528dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber ScopedLocalRef<jclass> hwRemoteBinderKlass( 529dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber env, FindClassOrDie(env, PACKAGE_PATH "/HwRemoteBinder")); 530dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 531dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber if (env->IsInstanceOf(binderObj, hwBinderKlass.get())) { 532dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber binder = JHwBinder::GetNativeContext(env, binderObj); 533dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber } else if (env->IsInstanceOf(binderObj, hwRemoteBinderKlass.get())) { 534dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber binder = JHwRemoteBinder::GetNativeContext( 535dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber env, binderObj)->getBinder(); 536dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber } else { 537dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber signalExceptionForError(env, INVALID_OPERATION); 538dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber return; 539dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber } 540dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber } 541dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 542dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber hardware::Parcel *parcel = 543dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber JHwParcel::GetNativeContext(env, thiz)->getParcel(); 544dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 545dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber status_t err = parcel->writeStrongBinder(binder); 546dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber signalExceptionForError(env, err); 547dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber} 548dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 549dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic jstring MakeStringObjFromHidlString(JNIEnv *env, const hidl_string &s) { 550dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber String16 utf16String(s.c_str(), s.size()); 551dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 552dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber return env->NewString( 553dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber reinterpret_cast<const jchar *>(utf16String.string()), 554dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber utf16String.size()); 555dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber} 556dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 557dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic jstring JHwParcel_native_readString(JNIEnv *env, jobject thiz) { 558dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber hardware::Parcel *parcel = 559dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber JHwParcel::GetNativeContext(env, thiz)->getParcel(); 560dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 561dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber size_t parentHandle; 562dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 563dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber const hidl_string *s = static_cast<const hidl_string *>( 564dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber parcel->readBuffer(&parentHandle)); 565dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 566dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber if (s == NULL) { 567dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber signalExceptionForError(env, UNKNOWN_ERROR); 568dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber return NULL; 569dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber } 570dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 571dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber status_t err = const_cast<hidl_string *>(s)->readEmbeddedFromParcel( 572dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber *parcel, parentHandle, 0 /* parentOffset */); 573dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 574dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber if (err != OK) { 575dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber signalExceptionForError(env, err); 576dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber return NULL; 577dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber } 578dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 579dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber return MakeStringObjFromHidlString(env, *s); 580dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber} 581dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 582dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber#define DEFINE_PARCEL_VECTOR_READER(Suffix,Type,NewType) \ 583dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic Type ## Array JHwParcel_native_read ## Suffix ## Vector( \ 584dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber JNIEnv *env, jobject thiz) { \ 585dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber hardware::Parcel *parcel = \ 586dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber JHwParcel::GetNativeContext(env, thiz)->getParcel(); \ 587dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber \ 588dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber size_t parentHandle; \ 589dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber \ 590dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber const hidl_vec<Type> *vec = \ 591dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber (const hidl_vec<Type> *)parcel->readBuffer(&parentHandle); \ 592dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber \ 593dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber if (vec == NULL) { \ 594dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber signalExceptionForError(env, UNKNOWN_ERROR); \ 595dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber return NULL; \ 596dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber } \ 597dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber \ 598dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber size_t childHandle; \ 599dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber \ 600dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber status_t err = const_cast<hidl_vec<Type> *>(vec) \ 601dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber ->readEmbeddedFromParcel( \ 602dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber *parcel, \ 603dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber parentHandle, \ 604dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 0 /* parentOffset */, \ 605dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber &childHandle); \ 606dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber \ 607dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber if (err != OK) { \ 608dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber signalExceptionForError(env, err); \ 609dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber return NULL; \ 610dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber } \ 611dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber \ 612dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber Type ## Array valObj = env->New ## NewType ## Array(vec->size()); \ 613dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber env->Set ## NewType ## ArrayRegion(valObj, 0, vec->size(), &(*vec)[0]); \ 614dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber \ 615dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber return valObj; \ 616dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber} 617dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 618dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_VECTOR_READER(Int8,jbyte,Byte) 619dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_VECTOR_READER(Int16,jshort,Short) 620dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_VECTOR_READER(Int32,jint,Int) 621dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_VECTOR_READER(Int64,jlong,Long) 622dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_VECTOR_READER(Float,jfloat,Float) 623dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas HuberDEFINE_PARCEL_VECTOR_READER(Double,jdouble,Double) 624dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 62586635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huberstatic jbooleanArray JHwParcel_native_readBoolVector( 62686635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber JNIEnv *env, jobject thiz) { 62786635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber hardware::Parcel *parcel = 62886635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber JHwParcel::GetNativeContext(env, thiz)->getParcel(); 62986635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber 63086635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber size_t parentHandle; 63186635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber 63286635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber const hidl_vec<bool> *vec = 63386635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber (const hidl_vec<bool> *)parcel->readBuffer(&parentHandle); 63486635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber 63586635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber if (vec == NULL) { 63686635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber signalExceptionForError(env, UNKNOWN_ERROR); 63786635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber return NULL; 63886635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber } 63986635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber 64086635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber size_t childHandle; 64186635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber 64286635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber status_t err = const_cast<hidl_vec<bool> *>(vec) 64386635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber ->readEmbeddedFromParcel( 64486635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber *parcel, 64586635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber parentHandle, 64686635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber 0 /* parentOffset */, 64786635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber &childHandle); 64886635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber 64986635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber if (err != OK) { 65086635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber signalExceptionForError(env, err); 65186635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber return NULL; 65286635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber } 65386635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber 65486635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber jbooleanArray valObj = env->NewBooleanArray(vec->size()); 65586635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber 65686635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber for (size_t i = 0; i < vec->size(); ++i) { 65786635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber jboolean x = (*vec)[i]; 65886635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber env->SetBooleanArrayRegion(valObj, i, 1, &x); 65986635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber } 66086635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber 66186635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber return valObj; 66286635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber} 66386635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber 664dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic jobjectArray MakeStringArray( 665dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber JNIEnv *env, const hidl_string *array, size_t size) { 666dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber ScopedLocalRef<jclass> stringKlass( 667dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber env, 668dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber env->FindClass("java/lang/String")); 669dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 670dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber // XXX Why can't I use ScopedLocalRef<> for the arrayObj and the stringObjs? 671dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 672dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber jobjectArray arrayObj = env->NewObjectArray(size, stringKlass.get(), NULL); 673dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 674dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber for (size_t i = 0; i < size; ++i) { 675dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber jstring stringObj = MakeStringObjFromHidlString(env, array[i]); 676dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 677dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber env->SetObjectArrayElement( 678dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber arrayObj, 679dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber i, 680dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber stringObj); 681dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber } 682dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 683dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber return arrayObj; 684dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber} 685dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 686dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic jobjectArray JHwParcel_native_readStringVector( 687dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber JNIEnv *env, jobject thiz) { 688dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber typedef hidl_vec<hidl_string> string_vec; 689dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 690dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber hardware::Parcel *parcel = 691dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber JHwParcel::GetNativeContext(env, thiz)->getParcel(); 692dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 693dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber size_t parentHandle; 694dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 695dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber const string_vec *vec= 696dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber (const string_vec *)parcel->readBuffer(&parentHandle); 697dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 698dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber if (vec == NULL) { 699dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber signalExceptionForError(env, UNKNOWN_ERROR); 700dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber return NULL; 701dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber } 702dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 703dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber size_t childHandle; 704dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber status_t err = const_cast<string_vec *>(vec)->readEmbeddedFromParcel( 705dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber *parcel, parentHandle, 0 /* parentOffset */, &childHandle); 706dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 707dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber for (size_t i = 0; (err == OK) && (i < vec->size()); ++i) { 708dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber err = const_cast<hidl_vec<hidl_string> *>(vec) 709dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber ->readEmbeddedFromParcel( 710dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber *parcel, 711dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber childHandle, 712dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber i * sizeof(hidl_string), 713dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber nullptr /* childHandle */); 714dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber } 715dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 716dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber if (err != OK) { 717dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber signalExceptionForError(env, err); 718dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber return NULL; 719dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber } 720dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 721dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber return MakeStringArray(env, &(*vec)[0], vec->size()); 722dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber} 723dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 724dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic void JHwParcel_native_writeStringVector( 725dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber JNIEnv *env, jobject thiz, jobjectArray arrayObj) { 726dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber typedef hidl_vec<hidl_string> string_vec; 727dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 728dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber if (arrayObj == NULL) { 729dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber jniThrowException(env, "java/lang/NullPointerException", NULL); 730dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber return; 731dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber } 732dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 733dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber jsize len = env->GetArrayLength(arrayObj); 734dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 735dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber sp<JHwParcel> impl = JHwParcel::GetNativeContext(env, thiz); 736dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 7379266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber void *vecPtr = 7389266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber impl->getStorage()->allocTemporaryStorage(sizeof(string_vec)); 7399266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber 7409266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber string_vec *vec = new (vecPtr) string_vec; 741dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 742dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber hidl_string *strings = impl->getStorage()->allocStringArray(len); 743dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber vec->setToExternal(strings, len); 744dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 745dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber for (jsize i = 0; i < len; ++i) { 746dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber ScopedLocalRef<jstring> stringObj( 747dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber env, 748dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber (jstring)env->GetObjectArrayElement(arrayObj, i)); 749dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 750dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber const hidl_string *s = 751dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber impl->getStorage()->allocTemporaryString(env, stringObj.get()); 752dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 753dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber strings[i].setToExternal(s->c_str(), s->size()); 754dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber } 755dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 756dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber hardware::Parcel *parcel = impl->getParcel(); 757dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 758dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber size_t parentHandle; 759dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber status_t err = parcel->writeBuffer(vec, sizeof(*vec), &parentHandle); 760dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 761dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber if (err == OK) { 762dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber size_t childHandle; 763dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber err = vec->writeEmbeddedToParcel( 764dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber parcel, 765dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber parentHandle, 766dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 0 /* parentOffset */, 767dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber &childHandle); 768dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 769dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber for (size_t i = 0; (err == OK) && (i < vec->size()); ++i) { 770dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber err = (*vec)[i].writeEmbeddedToParcel( 771dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber parcel, 772dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber childHandle, 773dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber i * sizeof(hidl_string)); 774dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber } 775dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber } 776dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 777dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber signalExceptionForError(env, err); 778dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber} 779dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 780dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic jobject JHwParcel_native_readStrongBinder(JNIEnv *env, jobject thiz) { 781dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber hardware::Parcel *parcel = 782dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber JHwParcel::GetNativeContext(env, thiz)->getParcel(); 783dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 784dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber sp<hardware::IBinder> binder = parcel->readStrongBinder(); 785dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 786dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber if (binder == NULL) { 787dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber return NULL; 788dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber } 789dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 790dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber return JHwRemoteBinder::NewObject(env, binder); 791dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber} 792dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 7939266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huberstatic jobject JHwParcel_native_readBuffer(JNIEnv *env, jobject thiz) { 7949266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber hardware::Parcel *parcel = 7959266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber JHwParcel::GetNativeContext(env, thiz)->getParcel(); 7969266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber 7979266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber size_t handle; 7989266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber const void *ptr = parcel->readBuffer(&handle); 7999266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber 8009266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber if (ptr == nullptr) { 8019266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber jniThrowException(env, "java/util/NoSuchElementException", NULL); 8029266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber return nullptr; 8039266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber } 8049266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber 8059266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber return JHwBlob::NewObject(env, ptr, handle); 8069266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber} 8079266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber 8089266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huberstatic jobject JHwParcel_native_readEmbeddedBuffer( 8099266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber JNIEnv *env, jobject thiz, jlong parentHandle, jlong offset) { 8109266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber hardware::Parcel *parcel = 8119266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber JHwParcel::GetNativeContext(env, thiz)->getParcel(); 8129266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber 8139266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber size_t childHandle; 8149266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber 8159266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber const void *ptr = 8169266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber parcel->readEmbeddedBuffer(&childHandle, parentHandle, offset); 8179266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber 8189266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber if (ptr == nullptr) { 8199266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber jniThrowException(env, "java/util/NoSuchElementException", NULL); 8209266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber return 0; 8219266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber } 8229266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber 8239266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber return JHwBlob::NewObject(env, ptr, childHandle); 8249266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber} 8259266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber 8269266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huberstatic void JHwParcel_native_writeBuffer( 8279266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber JNIEnv *env, jobject thiz, jobject blobObj) { 8289266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber if (blobObj == nullptr) { 8299266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber jniThrowException(env, "java/lang/NullPointerException", NULL); 8309266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber return; 8319266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber } 8329266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber 8339266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber hardware::Parcel *parcel = 8349266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber JHwParcel::GetNativeContext(env, thiz)->getParcel(); 8359266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber 8369266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber sp<JHwBlob> blob = JHwBlob::GetNativeContext(env, blobObj); 8379266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber status_t err = blob->writeToParcel(parcel); 8389266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber 8399266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber if (err != OK) { 8409266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber signalExceptionForError(env, err); 8419266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber } 8429266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber} 8439266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber 844dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstatic JNINativeMethod gMethods[] = { 845dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber { "native_init", "()J", (void *)JHwParcel_native_init }, 846dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber { "native_setup", "(Z)V", (void *)JHwParcel_native_setup }, 847dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 848dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber { "writeInterfaceToken", "(Ljava/lang/String;)V", 849dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber (void *)JHwParcel_native_writeInterfaceToken }, 850dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 85186635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber { "writeBool", "(Z)V", (void *)JHwParcel_native_writeBool }, 852dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber { "writeInt8", "(B)V", (void *)JHwParcel_native_writeInt8 }, 853dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber { "writeInt16", "(S)V", (void *)JHwParcel_native_writeInt16 }, 854dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber { "writeInt32", "(I)V", (void *)JHwParcel_native_writeInt32 }, 855dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber { "writeInt64", "(J)V", (void *)JHwParcel_native_writeInt64 }, 856dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber { "writeFloat", "(F)V", (void *)JHwParcel_native_writeFloat }, 857dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber { "writeDouble", "(D)V", (void *)JHwParcel_native_writeDouble }, 858dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 859dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber { "writeString", "(Ljava/lang/String;)V", 860dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber (void *)JHwParcel_native_writeString }, 861dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 86286635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber { "writeBoolVector", "([Z)V", (void *)JHwParcel_native_writeBoolVector }, 863dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber { "writeInt8Vector", "([B)V", (void *)JHwParcel_native_writeInt8Vector }, 864dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber { "writeInt16Vector", "([S)V", (void *)JHwParcel_native_writeInt16Vector }, 865dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber { "writeInt32Vector", "([I)V", (void *)JHwParcel_native_writeInt32Vector }, 866dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber { "writeInt64Vector", "([J)V", (void *)JHwParcel_native_writeInt64Vector }, 867dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber { "writeFloatVector", "([F)V", (void *)JHwParcel_native_writeFloatVector }, 868dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 869dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber { "writeDoubleVector", "([D)V", 870dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber (void *)JHwParcel_native_writeDoubleVector }, 871dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 872dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber { "writeStringVector", "([Ljava/lang/String;)V", 873dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber (void *)JHwParcel_native_writeStringVector }, 874dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 875dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber { "writeStrongBinder", "(L" PACKAGE_PATH "/IHwBinder;)V", 876dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber (void *)JHwParcel_native_writeStrongBinder }, 877dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 878dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber { "enforceInterface", "(Ljava/lang/String;)V", 879dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber (void *)JHwParcel_native_enforceInterface }, 880dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 88186635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber { "readBool", "()Z", (void *)JHwParcel_native_readBool }, 882dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber { "readInt8", "()B", (void *)JHwParcel_native_readInt8 }, 883dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber { "readInt16", "()S", (void *)JHwParcel_native_readInt16 }, 884dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber { "readInt32", "()I", (void *)JHwParcel_native_readInt32 }, 885dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber { "readInt64", "()J", (void *)JHwParcel_native_readInt64 }, 886dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber { "readFloat", "()F", (void *)JHwParcel_native_readFloat }, 887dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber { "readDouble", "()D", (void *)JHwParcel_native_readDouble }, 888dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 889dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber { "readString", "()Ljava/lang/String;", 890dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber (void *)JHwParcel_native_readString }, 891dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 892ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber { "readBoolVectorAsArray", "()[Z", 893ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber (void *)JHwParcel_native_readBoolVector }, 894ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber 895ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber { "readInt8VectorAsArray", "()[B", 896ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber (void *)JHwParcel_native_readInt8Vector }, 897ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber 898ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber { "readInt16VectorAsArray", "()[S", 899ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber (void *)JHwParcel_native_readInt16Vector }, 900ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber 901ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber { "readInt32VectorAsArray", "()[I", 902ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber (void *)JHwParcel_native_readInt32Vector }, 903ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber 904ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber { "readInt64VectorAsArray", "()[J", 905ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber (void *)JHwParcel_native_readInt64Vector }, 906ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber 907ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber { "readFloatVectorAsArray", "()[F", 908ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber (void *)JHwParcel_native_readFloatVector }, 909ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber 910ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber { "readDoubleVectorAsArray", "()[D", 911ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber (void *)JHwParcel_native_readDoubleVector }, 912ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber 913ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber { "readStringVectorAsArray", "()[Ljava/lang/String;", 914dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber (void *)JHwParcel_native_readStringVector }, 915dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 916dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber { "readStrongBinder", "()L" PACKAGE_PATH "/IHwBinder;", 917dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber (void *)JHwParcel_native_readStrongBinder }, 918dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 919dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber { "writeStatus", "(I)V", (void *)JHwParcel_native_writeStatus }, 920dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 921dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber { "verifySuccess", "()V", (void *)JHwParcel_native_verifySuccess }, 922dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 923dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber { "releaseTemporaryStorage", "()V", 924dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber (void *)JHwParcel_native_releaseTemporaryStorage }, 925dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 926dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber { "send", "()V", (void *)JHwParcel_native_send }, 9279266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber 9289266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber { "readBuffer", "()L" PACKAGE_PATH "/HwBlob;", 9299266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber (void *)JHwParcel_native_readBuffer }, 9309266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber 9319266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber { "readEmbeddedBuffer", "(JJ)L" PACKAGE_PATH "/HwBlob;", 9329266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber (void *)JHwParcel_native_readEmbeddedBuffer }, 9339266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber 9349266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber { "writeBuffer", "(L" PACKAGE_PATH "/HwBlob;)V", 9359266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber (void *)JHwParcel_native_writeBuffer }, 936dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}; 937dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 938dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Hubernamespace android { 939dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 940dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberint register_android_os_HwParcel(JNIEnv *env) { 941dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber return RegisterMethodsOrDie(env, CLASS_PATH, gMethods, NELEM(gMethods)); 942dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber} 943dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber 944dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber} // namespace android 945