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 Onoratostatic jfieldID s_chunkSizeField = 0; 414ababd922eac5931e0222862ff082dc29e012816Joe Onoratostatic jfieldID s_keyPrefixField = 0; 424ababd922eac5931e0222862ff082dc29e012816Joe Onorato 4358b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhatstatic jint 444ababd922eac5931e0222862ff082dc29e012816Joe OnoratoreadHeader_native(JNIEnv* env, jobject clazz, jobject headerObj, jobject fdObj) 454ababd922eac5931e0222862ff082dc29e012816Joe Onorato{ 464ababd922eac5931e0222862ff082dc29e012816Joe Onorato chunk_header_v1 flattenedHeader; 474ababd922eac5931e0222862ff082dc29e012816Joe Onorato ssize_t amt; 484ababd922eac5931e0222862ff082dc29e012816Joe Onorato String8 keyPrefix; 494ababd922eac5931e0222862ff082dc29e012816Joe Onorato char* buf; 504ababd922eac5931e0222862ff082dc29e012816Joe Onorato 51a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes int fd = jniGetFDFromFileDescriptor(env, fdObj); 524ababd922eac5931e0222862ff082dc29e012816Joe Onorato 534ababd922eac5931e0222862ff082dc29e012816Joe Onorato amt = read(fd, &flattenedHeader.headerSize, sizeof(flattenedHeader.headerSize)); 544ababd922eac5931e0222862ff082dc29e012816Joe Onorato if (amt != sizeof(flattenedHeader.headerSize)) { 5558b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat return (jint) -1; 564ababd922eac5931e0222862ff082dc29e012816Joe Onorato } 574ababd922eac5931e0222862ff082dc29e012816Joe Onorato 584ababd922eac5931e0222862ff082dc29e012816Joe Onorato int remainingHeader = flattenedHeader.headerSize - sizeof(flattenedHeader.headerSize); 594ababd922eac5931e0222862ff082dc29e012816Joe Onorato 604ababd922eac5931e0222862ff082dc29e012816Joe Onorato if (flattenedHeader.headerSize < (int)sizeof(chunk_header_v1)) { 618564c8da817a845353d213acd8636b76f567b234Steve Block ALOGW("Skipping unknown header: %d bytes", flattenedHeader.headerSize); 624ababd922eac5931e0222862ff082dc29e012816Joe Onorato if (remainingHeader > 0) { 634ababd922eac5931e0222862ff082dc29e012816Joe Onorato lseek(fd, remainingHeader, SEEK_CUR); 644ababd922eac5931e0222862ff082dc29e012816Joe Onorato // >0 means skip this chunk 6558b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat return (jint) 1; 664ababd922eac5931e0222862ff082dc29e012816Joe Onorato } 674ababd922eac5931e0222862ff082dc29e012816Joe Onorato } 684ababd922eac5931e0222862ff082dc29e012816Joe Onorato 694ababd922eac5931e0222862ff082dc29e012816Joe Onorato amt = read(fd, &flattenedHeader.version, 704ababd922eac5931e0222862ff082dc29e012816Joe Onorato sizeof(chunk_header_v1)-sizeof(flattenedHeader.headerSize)); 714ababd922eac5931e0222862ff082dc29e012816Joe Onorato if (amt <= 0) { 728564c8da817a845353d213acd8636b76f567b234Steve Block ALOGW("Failed reading chunk header"); 7358b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat return (jint) -1; 744ababd922eac5931e0222862ff082dc29e012816Joe Onorato } 754ababd922eac5931e0222862ff082dc29e012816Joe Onorato remainingHeader -= sizeof(chunk_header_v1)-sizeof(flattenedHeader.headerSize); 764ababd922eac5931e0222862ff082dc29e012816Joe Onorato 774ababd922eac5931e0222862ff082dc29e012816Joe Onorato if (flattenedHeader.version != VERSION_1_HEADER) { 788564c8da817a845353d213acd8636b76f567b234Steve Block ALOGW("Skipping unknown header version: 0x%08x, %d bytes", flattenedHeader.version, 794ababd922eac5931e0222862ff082dc29e012816Joe Onorato flattenedHeader.headerSize); 804ababd922eac5931e0222862ff082dc29e012816Joe Onorato if (remainingHeader > 0) { 814ababd922eac5931e0222862ff082dc29e012816Joe Onorato lseek(fd, remainingHeader, SEEK_CUR); 824ababd922eac5931e0222862ff082dc29e012816Joe Onorato // >0 means skip this chunk 8358b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat return (jint) 1; 844ababd922eac5931e0222862ff082dc29e012816Joe Onorato } 854ababd922eac5931e0222862ff082dc29e012816Joe Onorato } 864ababd922eac5931e0222862ff082dc29e012816Joe Onorato 8712a4da328a234b171b78cc341544817e9a074057Joe Onorato#if 0 885baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("chunk header:"); 895baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD(" headerSize=%d", flattenedHeader.headerSize); 905baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD(" version=0x%08x", flattenedHeader.version); 915baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD(" dataSize=%d", flattenedHeader.dataSize); 925baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD(" nameLength=%d", flattenedHeader.nameLength); 9312a4da328a234b171b78cc341544817e9a074057Joe Onorato#endif 9412a4da328a234b171b78cc341544817e9a074057Joe Onorato 954ababd922eac5931e0222862ff082dc29e012816Joe Onorato if (flattenedHeader.dataSize < 0 || flattenedHeader.nameLength < 0 || 964ababd922eac5931e0222862ff082dc29e012816Joe Onorato remainingHeader < flattenedHeader.nameLength) { 978564c8da817a845353d213acd8636b76f567b234Steve Block ALOGW("Malformed V1 header remainingHeader=%d dataSize=%d nameLength=%d", remainingHeader, 984ababd922eac5931e0222862ff082dc29e012816Joe Onorato flattenedHeader.dataSize, flattenedHeader.nameLength); 9958b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat return (jint) -1; 1004ababd922eac5931e0222862ff082dc29e012816Joe Onorato } 1014ababd922eac5931e0222862ff082dc29e012816Joe Onorato 1024ababd922eac5931e0222862ff082dc29e012816Joe Onorato buf = keyPrefix.lockBuffer(flattenedHeader.nameLength); 1034ababd922eac5931e0222862ff082dc29e012816Joe Onorato if (buf == NULL) { 1048564c8da817a845353d213acd8636b76f567b234Steve Block ALOGW("unable to allocate %d bytes", flattenedHeader.nameLength); 10558b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat return (jint) -1; 1064ababd922eac5931e0222862ff082dc29e012816Joe Onorato } 1074ababd922eac5931e0222862ff082dc29e012816Joe Onorato 1084ababd922eac5931e0222862ff082dc29e012816Joe Onorato amt = read(fd, buf, flattenedHeader.nameLength); 10912a4da328a234b171b78cc341544817e9a074057Joe Onorato buf[flattenedHeader.nameLength] = 0; 1104ababd922eac5931e0222862ff082dc29e012816Joe Onorato 1114ababd922eac5931e0222862ff082dc29e012816Joe Onorato keyPrefix.unlockBuffer(flattenedHeader.nameLength); 1124ababd922eac5931e0222862ff082dc29e012816Joe Onorato 1134ababd922eac5931e0222862ff082dc29e012816Joe Onorato remainingHeader -= flattenedHeader.nameLength; 1144ababd922eac5931e0222862ff082dc29e012816Joe Onorato 1154ababd922eac5931e0222862ff082dc29e012816Joe Onorato if (remainingHeader > 0) { 1164ababd922eac5931e0222862ff082dc29e012816Joe Onorato lseek(fd, remainingHeader, SEEK_CUR); 1174ababd922eac5931e0222862ff082dc29e012816Joe Onorato } 1184ababd922eac5931e0222862ff082dc29e012816Joe Onorato 1194ababd922eac5931e0222862ff082dc29e012816Joe Onorato env->SetIntField(headerObj, s_chunkSizeField, flattenedHeader.dataSize); 1204ababd922eac5931e0222862ff082dc29e012816Joe Onorato env->SetObjectField(headerObj, s_keyPrefixField, env->NewStringUTF(keyPrefix.string())); 1214ababd922eac5931e0222862ff082dc29e012816Joe Onorato 12258b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat return (jint) 0; 1234ababd922eac5931e0222862ff082dc29e012816Joe Onorato} 1244ababd922eac5931e0222862ff082dc29e012816Joe Onorato 12558b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhatstatic jint 1264ababd922eac5931e0222862ff082dc29e012816Joe OnoratoskipChunk_native(JNIEnv* env, jobject clazz, jobject fdObj, jint bytesToSkip) 1274ababd922eac5931e0222862ff082dc29e012816Joe Onorato{ 128a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes int fd = jniGetFDFromFileDescriptor(env, fdObj); 1294ababd922eac5931e0222862ff082dc29e012816Joe Onorato 1304ababd922eac5931e0222862ff082dc29e012816Joe Onorato lseek(fd, bytesToSkip, SEEK_CUR); 1314ababd922eac5931e0222862ff082dc29e012816Joe Onorato 13258b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat return (jint) 0; 1334ababd922eac5931e0222862ff082dc29e012816Joe Onorato} 1344ababd922eac5931e0222862ff082dc29e012816Joe Onorato 1354ababd922eac5931e0222862ff082dc29e012816Joe Onoratostatic int 1364ababd922eac5931e0222862ff082dc29e012816Joe Onoratopadding_len(int len) 1374ababd922eac5931e0222862ff082dc29e012816Joe Onorato{ 1384ababd922eac5931e0222862ff082dc29e012816Joe Onorato len = len % 4; 1394ababd922eac5931e0222862ff082dc29e012816Joe Onorato return len == 0 ? len : 4 - len; 1404ababd922eac5931e0222862ff082dc29e012816Joe Onorato} 1414ababd922eac5931e0222862ff082dc29e012816Joe Onorato 14258b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhatstatic jint 1434ababd922eac5931e0222862ff082dc29e012816Joe OnoratoallocateHeader_native(JNIEnv* env, jobject clazz, jobject headerObj, jobject fdObj) 1444ababd922eac5931e0222862ff082dc29e012816Joe Onorato{ 1454ababd922eac5931e0222862ff082dc29e012816Joe Onorato int pos; 1464ababd922eac5931e0222862ff082dc29e012816Joe Onorato jstring nameObj; 1474ababd922eac5931e0222862ff082dc29e012816Joe Onorato int nameLength; 1484ababd922eac5931e0222862ff082dc29e012816Joe Onorato int namePadding; 1494ababd922eac5931e0222862ff082dc29e012816Joe Onorato int headerSize; 1504ababd922eac5931e0222862ff082dc29e012816Joe Onorato 151a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes int fd = jniGetFDFromFileDescriptor(env, fdObj); 1524ababd922eac5931e0222862ff082dc29e012816Joe Onorato 1534ababd922eac5931e0222862ff082dc29e012816Joe Onorato nameObj = (jstring)env->GetObjectField(headerObj, s_keyPrefixField); 1544ababd922eac5931e0222862ff082dc29e012816Joe Onorato 1554ababd922eac5931e0222862ff082dc29e012816Joe Onorato nameLength = env->GetStringUTFLength(nameObj); 1564ababd922eac5931e0222862ff082dc29e012816Joe Onorato namePadding = padding_len(nameLength); 1574ababd922eac5931e0222862ff082dc29e012816Joe Onorato 1584ababd922eac5931e0222862ff082dc29e012816Joe Onorato headerSize = sizeof(chunk_header_v1) + nameLength + namePadding; 1594ababd922eac5931e0222862ff082dc29e012816Joe Onorato 1604ababd922eac5931e0222862ff082dc29e012816Joe Onorato pos = lseek(fd, 0, SEEK_CUR); 1614ababd922eac5931e0222862ff082dc29e012816Joe Onorato 1624ababd922eac5931e0222862ff082dc29e012816Joe Onorato lseek(fd, headerSize, SEEK_CUR); 163a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes 16458b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat return (jint) pos; 1654ababd922eac5931e0222862ff082dc29e012816Joe Onorato} 1664ababd922eac5931e0222862ff082dc29e012816Joe Onorato 16758b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhatstatic jint 1684ababd922eac5931e0222862ff082dc29e012816Joe OnoratowriteHeader_native(JNIEnv* env, jobject clazz, jobject headerObj, jobject fdObj, jint pos) 1694ababd922eac5931e0222862ff082dc29e012816Joe Onorato{ 1704ababd922eac5931e0222862ff082dc29e012816Joe Onorato int err; 1714ababd922eac5931e0222862ff082dc29e012816Joe Onorato chunk_header_v1 header; 1724ababd922eac5931e0222862ff082dc29e012816Joe Onorato int namePadding; 1734ababd922eac5931e0222862ff082dc29e012816Joe Onorato int prevPos; 1744ababd922eac5931e0222862ff082dc29e012816Joe Onorato jstring nameObj; 1754ababd922eac5931e0222862ff082dc29e012816Joe Onorato const char* buf; 1764ababd922eac5931e0222862ff082dc29e012816Joe Onorato 177a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes int fd = jniGetFDFromFileDescriptor(env, fdObj); 1784ababd922eac5931e0222862ff082dc29e012816Joe Onorato prevPos = lseek(fd, 0, SEEK_CUR); 1794ababd922eac5931e0222862ff082dc29e012816Joe Onorato 1804ababd922eac5931e0222862ff082dc29e012816Joe Onorato nameObj = (jstring)env->GetObjectField(headerObj, s_keyPrefixField); 1814ababd922eac5931e0222862ff082dc29e012816Joe Onorato header.nameLength = env->GetStringUTFLength(nameObj); 1824ababd922eac5931e0222862ff082dc29e012816Joe Onorato namePadding = padding_len(header.nameLength); 1834ababd922eac5931e0222862ff082dc29e012816Joe Onorato 1844ababd922eac5931e0222862ff082dc29e012816Joe Onorato header.headerSize = sizeof(chunk_header_v1) + header.nameLength + namePadding; 1854ababd922eac5931e0222862ff082dc29e012816Joe Onorato header.version = VERSION_1_HEADER; 18612a4da328a234b171b78cc341544817e9a074057Joe Onorato header.dataSize = prevPos - (pos + header.headerSize); 1874ababd922eac5931e0222862ff082dc29e012816Joe Onorato 1884ababd922eac5931e0222862ff082dc29e012816Joe Onorato lseek(fd, pos, SEEK_SET); 1894ababd922eac5931e0222862ff082dc29e012816Joe Onorato err = write(fd, &header, sizeof(chunk_header_v1)); 1904ababd922eac5931e0222862ff082dc29e012816Joe Onorato if (err != sizeof(chunk_header_v1)) { 19158b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat return (jint) errno; 1924ababd922eac5931e0222862ff082dc29e012816Joe Onorato } 1934ababd922eac5931e0222862ff082dc29e012816Joe Onorato 1944ababd922eac5931e0222862ff082dc29e012816Joe Onorato buf = env->GetStringUTFChars(nameObj, NULL); 1954ababd922eac5931e0222862ff082dc29e012816Joe Onorato err = write(fd, buf, header.nameLength); 1964ababd922eac5931e0222862ff082dc29e012816Joe Onorato env->ReleaseStringUTFChars(nameObj, buf); 1974ababd922eac5931e0222862ff082dc29e012816Joe Onorato if (err != header.nameLength) { 19858b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat return (jint) errno; 1994ababd922eac5931e0222862ff082dc29e012816Joe Onorato } 2004ababd922eac5931e0222862ff082dc29e012816Joe Onorato 2014ababd922eac5931e0222862ff082dc29e012816Joe Onorato if (namePadding != 0) { 2024ababd922eac5931e0222862ff082dc29e012816Joe Onorato int zero = 0; 2034ababd922eac5931e0222862ff082dc29e012816Joe Onorato err = write(fd, &zero, namePadding); 2044ababd922eac5931e0222862ff082dc29e012816Joe Onorato if (err != namePadding) { 20558b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat return (jint) errno; 2064ababd922eac5931e0222862ff082dc29e012816Joe Onorato } 2074ababd922eac5931e0222862ff082dc29e012816Joe Onorato } 2084ababd922eac5931e0222862ff082dc29e012816Joe Onorato 2094ababd922eac5931e0222862ff082dc29e012816Joe Onorato lseek(fd, prevPos, SEEK_SET); 21058b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat return (jint) 0; 2114ababd922eac5931e0222862ff082dc29e012816Joe Onorato} 2124ababd922eac5931e0222862ff082dc29e012816Joe Onorato 2134ababd922eac5931e0222862ff082dc29e012816Joe Onoratostatic const JNINativeMethod g_methods[] = { 2144ababd922eac5931e0222862ff082dc29e012816Joe Onorato { "readHeader_native", 2154528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tate "(Landroid/app/backup/BackupHelperDispatcher$Header;Ljava/io/FileDescriptor;)I", 2164ababd922eac5931e0222862ff082dc29e012816Joe Onorato (void*)readHeader_native }, 2174ababd922eac5931e0222862ff082dc29e012816Joe Onorato { "skipChunk_native", 2184ababd922eac5931e0222862ff082dc29e012816Joe Onorato "(Ljava/io/FileDescriptor;I)I", 2194ababd922eac5931e0222862ff082dc29e012816Joe Onorato (void*)skipChunk_native }, 2204ababd922eac5931e0222862ff082dc29e012816Joe Onorato { "allocateHeader_native", 2214528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tate "(Landroid/app/backup/BackupHelperDispatcher$Header;Ljava/io/FileDescriptor;)I", 2224ababd922eac5931e0222862ff082dc29e012816Joe Onorato (void*)allocateHeader_native }, 2234ababd922eac5931e0222862ff082dc29e012816Joe Onorato { "writeHeader_native", 2244528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tate "(Landroid/app/backup/BackupHelperDispatcher$Header;Ljava/io/FileDescriptor;I)I", 2254ababd922eac5931e0222862ff082dc29e012816Joe Onorato (void*)writeHeader_native }, 2264ababd922eac5931e0222862ff082dc29e012816Joe Onorato}; 2274ababd922eac5931e0222862ff082dc29e012816Joe Onorato 2284ababd922eac5931e0222862ff082dc29e012816Joe Onoratoint register_android_backup_BackupHelperDispatcher(JNIEnv* env) 2294ababd922eac5931e0222862ff082dc29e012816Joe Onorato{ 230a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes jclass clazz = env->FindClass("android/app/backup/BackupHelperDispatcher$Header"); 2314ababd922eac5931e0222862ff082dc29e012816Joe Onorato LOG_FATAL_IF(clazz == NULL, 2324528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tate "Unable to find class android.app.backup.BackupHelperDispatcher.Header"); 2334ababd922eac5931e0222862ff082dc29e012816Joe Onorato s_chunkSizeField = env->GetFieldID(clazz, "chunkSize", "I"); 2344ababd922eac5931e0222862ff082dc29e012816Joe Onorato LOG_FATAL_IF(s_chunkSizeField == NULL, 2354528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tate "Unable to find chunkSize field in android.app.backup.BackupHelperDispatcher.Header"); 2364ababd922eac5931e0222862ff082dc29e012816Joe Onorato s_keyPrefixField = env->GetFieldID(clazz, "keyPrefix", "Ljava/lang/String;"); 2374ababd922eac5931e0222862ff082dc29e012816Joe Onorato LOG_FATAL_IF(s_keyPrefixField == NULL, 2384528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tate "Unable to find keyPrefix field in android.app.backup.BackupHelperDispatcher.Header"); 239a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes 2404528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tate return AndroidRuntime::registerNativeMethods(env, "android/app/backup/BackupHelperDispatcher", 2414ababd922eac5931e0222862ff082dc29e012816Joe Onorato g_methods, NELEM(g_methods)); 2424ababd922eac5931e0222862ff082dc29e012816Joe Onorato} 2434ababd922eac5931e0222862ff082dc29e012816Joe Onorato 2444ababd922eac5931e0222862ff082dc29e012816Joe Onorato} 245