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