android_backup_BackupHelperDispatcher.cpp revision 4528186e0d65fc68ef0dd1941aa2ac8aefcd55a3
14ababd922eac5931e0222862ff082dc29e012816Joe Onorato/* 24ababd922eac5931e0222862ff082dc29e012816Joe Onorato * Copyright (C) 2009 The Android Open Source Project 34ababd922eac5931e0222862ff082dc29e012816Joe Onorato * 44ababd922eac5931e0222862ff082dc29e012816Joe Onorato * Licensed under the Apache License, Version 2.0 (the "License"); 54ababd922eac5931e0222862ff082dc29e012816Joe Onorato * you may not use this file except in compliance with the License. 64ababd922eac5931e0222862ff082dc29e012816Joe Onorato * You may obtain a copy of the License at 74ababd922eac5931e0222862ff082dc29e012816Joe Onorato * 84ababd922eac5931e0222862ff082dc29e012816Joe Onorato * http://www.apache.org/licenses/LICENSE-2.0 94ababd922eac5931e0222862ff082dc29e012816Joe Onorato * 104ababd922eac5931e0222862ff082dc29e012816Joe Onorato * Unless required by applicable law or agreed to in writing, software 114ababd922eac5931e0222862ff082dc29e012816Joe Onorato * distributed under the License is distributed on an "AS IS" BASIS, 124ababd922eac5931e0222862ff082dc29e012816Joe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134ababd922eac5931e0222862ff082dc29e012816Joe Onorato * See the License for the specific language governing permissions and 144ababd922eac5931e0222862ff082dc29e012816Joe Onorato * limitations under the License. 154ababd922eac5931e0222862ff082dc29e012816Joe Onorato */ 164ababd922eac5931e0222862ff082dc29e012816Joe Onorato 174ababd922eac5931e0222862ff082dc29e012816Joe Onorato#define LOG_TAG "BackupHelperDispatcher_native" 184ababd922eac5931e0222862ff082dc29e012816Joe Onorato#include <utils/Log.h> 194ababd922eac5931e0222862ff082dc29e012816Joe Onorato 204ababd922eac5931e0222862ff082dc29e012816Joe Onorato#include "JNIHelp.h" 214ababd922eac5931e0222862ff082dc29e012816Joe Onorato#include <android_runtime/AndroidRuntime.h> 224ababd922eac5931e0222862ff082dc29e012816Joe Onorato 234ababd922eac5931e0222862ff082dc29e012816Joe Onorato#include <sys/types.h> 244ababd922eac5931e0222862ff082dc29e012816Joe Onorato#include <sys/uio.h> 254ababd922eac5931e0222862ff082dc29e012816Joe Onorato#include <unistd.h> 264ababd922eac5931e0222862ff082dc29e012816Joe Onorato 274ababd922eac5931e0222862ff082dc29e012816Joe Onorato 284ababd922eac5931e0222862ff082dc29e012816Joe Onorato#define VERSION_1_HEADER 0x01706c48 // 'Hlp'1 little endian 294ababd922eac5931e0222862ff082dc29e012816Joe Onorato 304ababd922eac5931e0222862ff082dc29e012816Joe Onoratonamespace android 314ababd922eac5931e0222862ff082dc29e012816Joe Onorato{ 324ababd922eac5931e0222862ff082dc29e012816Joe Onorato 334ababd922eac5931e0222862ff082dc29e012816Joe Onoratostruct chunk_header_v1 { 344ababd922eac5931e0222862ff082dc29e012816Joe Onorato int headerSize; 354ababd922eac5931e0222862ff082dc29e012816Joe Onorato int version; 364ababd922eac5931e0222862ff082dc29e012816Joe Onorato int dataSize; // corresponds to Header.chunkSize 374ababd922eac5931e0222862ff082dc29e012816Joe Onorato int nameLength; // not including the NULL terminator, which is not written to the file 384ababd922eac5931e0222862ff082dc29e012816Joe Onorato}; 394ababd922eac5931e0222862ff082dc29e012816Joe Onorato 404ababd922eac5931e0222862ff082dc29e012816Joe Onorato// java.io.FileDescriptor 414ababd922eac5931e0222862ff082dc29e012816Joe Onoratostatic jfieldID s_descriptorField = 0; 424ababd922eac5931e0222862ff082dc29e012816Joe Onoratostatic jfieldID s_chunkSizeField = 0; 434ababd922eac5931e0222862ff082dc29e012816Joe Onoratostatic jfieldID s_keyPrefixField = 0; 444ababd922eac5931e0222862ff082dc29e012816Joe Onorato 454ababd922eac5931e0222862ff082dc29e012816Joe Onoratostatic int 464ababd922eac5931e0222862ff082dc29e012816Joe OnoratoreadHeader_native(JNIEnv* env, jobject clazz, jobject headerObj, jobject fdObj) 474ababd922eac5931e0222862ff082dc29e012816Joe Onorato{ 484ababd922eac5931e0222862ff082dc29e012816Joe Onorato chunk_header_v1 flattenedHeader; 494ababd922eac5931e0222862ff082dc29e012816Joe Onorato int fd; 504ababd922eac5931e0222862ff082dc29e012816Joe Onorato ssize_t amt; 514ababd922eac5931e0222862ff082dc29e012816Joe Onorato String8 keyPrefix; 524ababd922eac5931e0222862ff082dc29e012816Joe Onorato char* buf; 534ababd922eac5931e0222862ff082dc29e012816Joe Onorato 544ababd922eac5931e0222862ff082dc29e012816Joe Onorato fd = env->GetIntField(fdObj, s_descriptorField); 554ababd922eac5931e0222862ff082dc29e012816Joe Onorato 564ababd922eac5931e0222862ff082dc29e012816Joe Onorato amt = read(fd, &flattenedHeader.headerSize, sizeof(flattenedHeader.headerSize)); 574ababd922eac5931e0222862ff082dc29e012816Joe Onorato if (amt != sizeof(flattenedHeader.headerSize)) { 584ababd922eac5931e0222862ff082dc29e012816Joe Onorato return -1; 594ababd922eac5931e0222862ff082dc29e012816Joe Onorato } 604ababd922eac5931e0222862ff082dc29e012816Joe Onorato 614ababd922eac5931e0222862ff082dc29e012816Joe Onorato int remainingHeader = flattenedHeader.headerSize - sizeof(flattenedHeader.headerSize); 624ababd922eac5931e0222862ff082dc29e012816Joe Onorato 634ababd922eac5931e0222862ff082dc29e012816Joe Onorato if (flattenedHeader.headerSize < (int)sizeof(chunk_header_v1)) { 644ababd922eac5931e0222862ff082dc29e012816Joe Onorato LOGW("Skipping unknown header: %d bytes", flattenedHeader.headerSize); 654ababd922eac5931e0222862ff082dc29e012816Joe Onorato if (remainingHeader > 0) { 664ababd922eac5931e0222862ff082dc29e012816Joe Onorato lseek(fd, remainingHeader, SEEK_CUR); 674ababd922eac5931e0222862ff082dc29e012816Joe Onorato // >0 means skip this chunk 684ababd922eac5931e0222862ff082dc29e012816Joe Onorato return 1; 694ababd922eac5931e0222862ff082dc29e012816Joe Onorato } 704ababd922eac5931e0222862ff082dc29e012816Joe Onorato } 714ababd922eac5931e0222862ff082dc29e012816Joe Onorato 724ababd922eac5931e0222862ff082dc29e012816Joe Onorato amt = read(fd, &flattenedHeader.version, 734ababd922eac5931e0222862ff082dc29e012816Joe Onorato sizeof(chunk_header_v1)-sizeof(flattenedHeader.headerSize)); 744ababd922eac5931e0222862ff082dc29e012816Joe Onorato if (amt <= 0) { 754ababd922eac5931e0222862ff082dc29e012816Joe Onorato LOGW("Failed reading chunk header"); 764ababd922eac5931e0222862ff082dc29e012816Joe Onorato return -1; 774ababd922eac5931e0222862ff082dc29e012816Joe Onorato } 784ababd922eac5931e0222862ff082dc29e012816Joe Onorato remainingHeader -= sizeof(chunk_header_v1)-sizeof(flattenedHeader.headerSize); 794ababd922eac5931e0222862ff082dc29e012816Joe Onorato 804ababd922eac5931e0222862ff082dc29e012816Joe Onorato if (flattenedHeader.version != VERSION_1_HEADER) { 814ababd922eac5931e0222862ff082dc29e012816Joe Onorato LOGW("Skipping unknown header version: 0x%08x, %d bytes", flattenedHeader.version, 824ababd922eac5931e0222862ff082dc29e012816Joe Onorato flattenedHeader.headerSize); 834ababd922eac5931e0222862ff082dc29e012816Joe Onorato if (remainingHeader > 0) { 844ababd922eac5931e0222862ff082dc29e012816Joe Onorato lseek(fd, remainingHeader, SEEK_CUR); 854ababd922eac5931e0222862ff082dc29e012816Joe Onorato // >0 means skip this chunk 864ababd922eac5931e0222862ff082dc29e012816Joe Onorato return 1; 874ababd922eac5931e0222862ff082dc29e012816Joe Onorato } 884ababd922eac5931e0222862ff082dc29e012816Joe Onorato } 894ababd922eac5931e0222862ff082dc29e012816Joe Onorato 9012a4da328a234b171b78cc341544817e9a074057Joe Onorato#if 0 9112a4da328a234b171b78cc341544817e9a074057Joe Onorato LOGD("chunk header:"); 9212a4da328a234b171b78cc341544817e9a074057Joe Onorato LOGD(" headerSize=%d", flattenedHeader.headerSize); 9312a4da328a234b171b78cc341544817e9a074057Joe Onorato LOGD(" version=0x%08x", flattenedHeader.version); 9412a4da328a234b171b78cc341544817e9a074057Joe Onorato LOGD(" dataSize=%d", flattenedHeader.dataSize); 9512a4da328a234b171b78cc341544817e9a074057Joe Onorato LOGD(" nameLength=%d", flattenedHeader.nameLength); 9612a4da328a234b171b78cc341544817e9a074057Joe Onorato#endif 9712a4da328a234b171b78cc341544817e9a074057Joe Onorato 984ababd922eac5931e0222862ff082dc29e012816Joe Onorato if (flattenedHeader.dataSize < 0 || flattenedHeader.nameLength < 0 || 994ababd922eac5931e0222862ff082dc29e012816Joe Onorato remainingHeader < flattenedHeader.nameLength) { 1004ababd922eac5931e0222862ff082dc29e012816Joe Onorato LOGW("Malformed V1 header remainingHeader=%d dataSize=%d nameLength=%d", remainingHeader, 1014ababd922eac5931e0222862ff082dc29e012816Joe Onorato flattenedHeader.dataSize, flattenedHeader.nameLength); 1024ababd922eac5931e0222862ff082dc29e012816Joe Onorato return -1; 1034ababd922eac5931e0222862ff082dc29e012816Joe Onorato } 1044ababd922eac5931e0222862ff082dc29e012816Joe Onorato 1054ababd922eac5931e0222862ff082dc29e012816Joe Onorato buf = keyPrefix.lockBuffer(flattenedHeader.nameLength); 1064ababd922eac5931e0222862ff082dc29e012816Joe Onorato if (buf == NULL) { 1074ababd922eac5931e0222862ff082dc29e012816Joe Onorato LOGW("unable to allocate %d bytes", flattenedHeader.nameLength); 1084ababd922eac5931e0222862ff082dc29e012816Joe Onorato return -1; 1094ababd922eac5931e0222862ff082dc29e012816Joe Onorato } 1104ababd922eac5931e0222862ff082dc29e012816Joe Onorato 1114ababd922eac5931e0222862ff082dc29e012816Joe Onorato amt = read(fd, buf, flattenedHeader.nameLength); 11212a4da328a234b171b78cc341544817e9a074057Joe Onorato buf[flattenedHeader.nameLength] = 0; 1134ababd922eac5931e0222862ff082dc29e012816Joe Onorato 1144ababd922eac5931e0222862ff082dc29e012816Joe Onorato keyPrefix.unlockBuffer(flattenedHeader.nameLength); 1154ababd922eac5931e0222862ff082dc29e012816Joe Onorato 1164ababd922eac5931e0222862ff082dc29e012816Joe Onorato remainingHeader -= flattenedHeader.nameLength; 1174ababd922eac5931e0222862ff082dc29e012816Joe Onorato 1184ababd922eac5931e0222862ff082dc29e012816Joe Onorato if (remainingHeader > 0) { 1194ababd922eac5931e0222862ff082dc29e012816Joe Onorato lseek(fd, remainingHeader, SEEK_CUR); 1204ababd922eac5931e0222862ff082dc29e012816Joe Onorato } 1214ababd922eac5931e0222862ff082dc29e012816Joe Onorato 1224ababd922eac5931e0222862ff082dc29e012816Joe Onorato env->SetIntField(headerObj, s_chunkSizeField, flattenedHeader.dataSize); 1234ababd922eac5931e0222862ff082dc29e012816Joe Onorato env->SetObjectField(headerObj, s_keyPrefixField, env->NewStringUTF(keyPrefix.string())); 1244ababd922eac5931e0222862ff082dc29e012816Joe Onorato 1254ababd922eac5931e0222862ff082dc29e012816Joe Onorato return 0; 1264ababd922eac5931e0222862ff082dc29e012816Joe Onorato} 1274ababd922eac5931e0222862ff082dc29e012816Joe Onorato 1284ababd922eac5931e0222862ff082dc29e012816Joe Onoratostatic int 1294ababd922eac5931e0222862ff082dc29e012816Joe OnoratoskipChunk_native(JNIEnv* env, jobject clazz, jobject fdObj, jint bytesToSkip) 1304ababd922eac5931e0222862ff082dc29e012816Joe Onorato{ 1314ababd922eac5931e0222862ff082dc29e012816Joe Onorato int fd; 1324ababd922eac5931e0222862ff082dc29e012816Joe Onorato 1334ababd922eac5931e0222862ff082dc29e012816Joe Onorato fd = env->GetIntField(fdObj, s_descriptorField); 1344ababd922eac5931e0222862ff082dc29e012816Joe Onorato 1354ababd922eac5931e0222862ff082dc29e012816Joe Onorato lseek(fd, bytesToSkip, SEEK_CUR); 1364ababd922eac5931e0222862ff082dc29e012816Joe Onorato 1374ababd922eac5931e0222862ff082dc29e012816Joe Onorato return 0; 1384ababd922eac5931e0222862ff082dc29e012816Joe Onorato} 1394ababd922eac5931e0222862ff082dc29e012816Joe Onorato 1404ababd922eac5931e0222862ff082dc29e012816Joe Onoratostatic int 1414ababd922eac5931e0222862ff082dc29e012816Joe Onoratopadding_len(int len) 1424ababd922eac5931e0222862ff082dc29e012816Joe Onorato{ 1434ababd922eac5931e0222862ff082dc29e012816Joe Onorato len = len % 4; 1444ababd922eac5931e0222862ff082dc29e012816Joe Onorato return len == 0 ? len : 4 - len; 1454ababd922eac5931e0222862ff082dc29e012816Joe Onorato} 1464ababd922eac5931e0222862ff082dc29e012816Joe Onorato 1474ababd922eac5931e0222862ff082dc29e012816Joe Onoratostatic int 1484ababd922eac5931e0222862ff082dc29e012816Joe OnoratoallocateHeader_native(JNIEnv* env, jobject clazz, jobject headerObj, jobject fdObj) 1494ababd922eac5931e0222862ff082dc29e012816Joe Onorato{ 1504ababd922eac5931e0222862ff082dc29e012816Joe Onorato int pos; 1514ababd922eac5931e0222862ff082dc29e012816Joe Onorato jstring nameObj; 1524ababd922eac5931e0222862ff082dc29e012816Joe Onorato int nameLength; 1534ababd922eac5931e0222862ff082dc29e012816Joe Onorato int namePadding; 1544ababd922eac5931e0222862ff082dc29e012816Joe Onorato int headerSize; 1554ababd922eac5931e0222862ff082dc29e012816Joe Onorato int fd; 1564ababd922eac5931e0222862ff082dc29e012816Joe Onorato 1574ababd922eac5931e0222862ff082dc29e012816Joe Onorato fd = env->GetIntField(fdObj, s_descriptorField); 1584ababd922eac5931e0222862ff082dc29e012816Joe Onorato 1594ababd922eac5931e0222862ff082dc29e012816Joe Onorato nameObj = (jstring)env->GetObjectField(headerObj, s_keyPrefixField); 1604ababd922eac5931e0222862ff082dc29e012816Joe Onorato 1614ababd922eac5931e0222862ff082dc29e012816Joe Onorato nameLength = env->GetStringUTFLength(nameObj); 1624ababd922eac5931e0222862ff082dc29e012816Joe Onorato namePadding = padding_len(nameLength); 1634ababd922eac5931e0222862ff082dc29e012816Joe Onorato 1644ababd922eac5931e0222862ff082dc29e012816Joe Onorato headerSize = sizeof(chunk_header_v1) + nameLength + namePadding; 1654ababd922eac5931e0222862ff082dc29e012816Joe Onorato 1664ababd922eac5931e0222862ff082dc29e012816Joe Onorato pos = lseek(fd, 0, SEEK_CUR); 1674ababd922eac5931e0222862ff082dc29e012816Joe Onorato 1684ababd922eac5931e0222862ff082dc29e012816Joe Onorato lseek(fd, headerSize, SEEK_CUR); 1694ababd922eac5931e0222862ff082dc29e012816Joe Onorato 1704ababd922eac5931e0222862ff082dc29e012816Joe Onorato return pos; 1714ababd922eac5931e0222862ff082dc29e012816Joe Onorato} 1724ababd922eac5931e0222862ff082dc29e012816Joe Onorato 1734ababd922eac5931e0222862ff082dc29e012816Joe Onoratostatic int 1744ababd922eac5931e0222862ff082dc29e012816Joe OnoratowriteHeader_native(JNIEnv* env, jobject clazz, jobject headerObj, jobject fdObj, jint pos) 1754ababd922eac5931e0222862ff082dc29e012816Joe Onorato{ 1764ababd922eac5931e0222862ff082dc29e012816Joe Onorato int err; 1774ababd922eac5931e0222862ff082dc29e012816Joe Onorato chunk_header_v1 header; 1784ababd922eac5931e0222862ff082dc29e012816Joe Onorato int fd; 1794ababd922eac5931e0222862ff082dc29e012816Joe Onorato int namePadding; 1804ababd922eac5931e0222862ff082dc29e012816Joe Onorato int prevPos; 1814ababd922eac5931e0222862ff082dc29e012816Joe Onorato jstring nameObj; 1824ababd922eac5931e0222862ff082dc29e012816Joe Onorato const char* buf; 1834ababd922eac5931e0222862ff082dc29e012816Joe Onorato 1844ababd922eac5931e0222862ff082dc29e012816Joe Onorato fd = env->GetIntField(fdObj, s_descriptorField); 1854ababd922eac5931e0222862ff082dc29e012816Joe Onorato prevPos = lseek(fd, 0, SEEK_CUR); 1864ababd922eac5931e0222862ff082dc29e012816Joe Onorato 1874ababd922eac5931e0222862ff082dc29e012816Joe Onorato nameObj = (jstring)env->GetObjectField(headerObj, s_keyPrefixField); 1884ababd922eac5931e0222862ff082dc29e012816Joe Onorato header.nameLength = env->GetStringUTFLength(nameObj); 1894ababd922eac5931e0222862ff082dc29e012816Joe Onorato namePadding = padding_len(header.nameLength); 1904ababd922eac5931e0222862ff082dc29e012816Joe Onorato 1914ababd922eac5931e0222862ff082dc29e012816Joe Onorato header.headerSize = sizeof(chunk_header_v1) + header.nameLength + namePadding; 1924ababd922eac5931e0222862ff082dc29e012816Joe Onorato header.version = VERSION_1_HEADER; 19312a4da328a234b171b78cc341544817e9a074057Joe Onorato header.dataSize = prevPos - (pos + header.headerSize); 1944ababd922eac5931e0222862ff082dc29e012816Joe Onorato 1954ababd922eac5931e0222862ff082dc29e012816Joe Onorato lseek(fd, pos, SEEK_SET); 1964ababd922eac5931e0222862ff082dc29e012816Joe Onorato err = write(fd, &header, sizeof(chunk_header_v1)); 1974ababd922eac5931e0222862ff082dc29e012816Joe Onorato if (err != sizeof(chunk_header_v1)) { 1984ababd922eac5931e0222862ff082dc29e012816Joe Onorato return errno; 1994ababd922eac5931e0222862ff082dc29e012816Joe Onorato } 2004ababd922eac5931e0222862ff082dc29e012816Joe Onorato 2014ababd922eac5931e0222862ff082dc29e012816Joe Onorato buf = env->GetStringUTFChars(nameObj, NULL); 2024ababd922eac5931e0222862ff082dc29e012816Joe Onorato err = write(fd, buf, header.nameLength); 2034ababd922eac5931e0222862ff082dc29e012816Joe Onorato env->ReleaseStringUTFChars(nameObj, buf); 2044ababd922eac5931e0222862ff082dc29e012816Joe Onorato if (err != header.nameLength) { 2054ababd922eac5931e0222862ff082dc29e012816Joe Onorato return errno; 2064ababd922eac5931e0222862ff082dc29e012816Joe Onorato } 2074ababd922eac5931e0222862ff082dc29e012816Joe Onorato 2084ababd922eac5931e0222862ff082dc29e012816Joe Onorato if (namePadding != 0) { 2094ababd922eac5931e0222862ff082dc29e012816Joe Onorato int zero = 0; 2104ababd922eac5931e0222862ff082dc29e012816Joe Onorato err = write(fd, &zero, namePadding); 2114ababd922eac5931e0222862ff082dc29e012816Joe Onorato if (err != namePadding) { 2124ababd922eac5931e0222862ff082dc29e012816Joe Onorato return errno; 2134ababd922eac5931e0222862ff082dc29e012816Joe Onorato } 2144ababd922eac5931e0222862ff082dc29e012816Joe Onorato } 2154ababd922eac5931e0222862ff082dc29e012816Joe Onorato 2164ababd922eac5931e0222862ff082dc29e012816Joe Onorato lseek(fd, prevPos, SEEK_SET); 2174ababd922eac5931e0222862ff082dc29e012816Joe Onorato return 0; 2184ababd922eac5931e0222862ff082dc29e012816Joe Onorato} 2194ababd922eac5931e0222862ff082dc29e012816Joe Onorato 2204ababd922eac5931e0222862ff082dc29e012816Joe Onoratostatic const JNINativeMethod g_methods[] = { 2214ababd922eac5931e0222862ff082dc29e012816Joe Onorato { "readHeader_native", 2224528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tate "(Landroid/app/backup/BackupHelperDispatcher$Header;Ljava/io/FileDescriptor;)I", 2234ababd922eac5931e0222862ff082dc29e012816Joe Onorato (void*)readHeader_native }, 2244ababd922eac5931e0222862ff082dc29e012816Joe Onorato { "skipChunk_native", 2254ababd922eac5931e0222862ff082dc29e012816Joe Onorato "(Ljava/io/FileDescriptor;I)I", 2264ababd922eac5931e0222862ff082dc29e012816Joe Onorato (void*)skipChunk_native }, 2274ababd922eac5931e0222862ff082dc29e012816Joe Onorato { "allocateHeader_native", 2284528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tate "(Landroid/app/backup/BackupHelperDispatcher$Header;Ljava/io/FileDescriptor;)I", 2294ababd922eac5931e0222862ff082dc29e012816Joe Onorato (void*)allocateHeader_native }, 2304ababd922eac5931e0222862ff082dc29e012816Joe Onorato { "writeHeader_native", 2314528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tate "(Landroid/app/backup/BackupHelperDispatcher$Header;Ljava/io/FileDescriptor;I)I", 2324ababd922eac5931e0222862ff082dc29e012816Joe Onorato (void*)writeHeader_native }, 2334ababd922eac5931e0222862ff082dc29e012816Joe Onorato}; 2344ababd922eac5931e0222862ff082dc29e012816Joe Onorato 2354ababd922eac5931e0222862ff082dc29e012816Joe Onoratoint register_android_backup_BackupHelperDispatcher(JNIEnv* env) 2364ababd922eac5931e0222862ff082dc29e012816Joe Onorato{ 2374ababd922eac5931e0222862ff082dc29e012816Joe Onorato jclass clazz; 2384ababd922eac5931e0222862ff082dc29e012816Joe Onorato 2394ababd922eac5931e0222862ff082dc29e012816Joe Onorato clazz = env->FindClass("java/io/FileDescriptor"); 2404ababd922eac5931e0222862ff082dc29e012816Joe Onorato LOG_FATAL_IF(clazz == NULL, "Unable to find class java.io.FileDescriptor"); 2414ababd922eac5931e0222862ff082dc29e012816Joe Onorato s_descriptorField = env->GetFieldID(clazz, "descriptor", "I"); 2424ababd922eac5931e0222862ff082dc29e012816Joe Onorato LOG_FATAL_IF(s_descriptorField == NULL, 2434ababd922eac5931e0222862ff082dc29e012816Joe Onorato "Unable to find descriptor field in java.io.FileDescriptor"); 2444ababd922eac5931e0222862ff082dc29e012816Joe Onorato 2454528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tate clazz = env->FindClass("android/app/backup/BackupHelperDispatcher$Header"); 2464ababd922eac5931e0222862ff082dc29e012816Joe Onorato LOG_FATAL_IF(clazz == NULL, 2474528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tate "Unable to find class android.app.backup.BackupHelperDispatcher.Header"); 2484ababd922eac5931e0222862ff082dc29e012816Joe Onorato s_chunkSizeField = env->GetFieldID(clazz, "chunkSize", "I"); 2494ababd922eac5931e0222862ff082dc29e012816Joe Onorato LOG_FATAL_IF(s_chunkSizeField == NULL, 2504528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tate "Unable to find chunkSize field in android.app.backup.BackupHelperDispatcher.Header"); 2514ababd922eac5931e0222862ff082dc29e012816Joe Onorato s_keyPrefixField = env->GetFieldID(clazz, "keyPrefix", "Ljava/lang/String;"); 2524ababd922eac5931e0222862ff082dc29e012816Joe Onorato LOG_FATAL_IF(s_keyPrefixField == NULL, 2534528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tate "Unable to find keyPrefix field in android.app.backup.BackupHelperDispatcher.Header"); 2544ababd922eac5931e0222862ff082dc29e012816Joe Onorato 2554528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tate return AndroidRuntime::registerNativeMethods(env, "android/app/backup/BackupHelperDispatcher", 2564ababd922eac5931e0222862ff082dc29e012816Joe Onorato g_methods, NELEM(g_methods)); 2574ababd922eac5931e0222862ff082dc29e012816Joe Onorato} 2584ababd922eac5931e0222862ff082dc29e012816Joe Onorato 2594ababd922eac5931e0222862ff082dc29e012816Joe Onorato} 260