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
202279b2534272282a5b5152723235da397e49195cSteven Moreland#include <nativehelper/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
27987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe#include "core_jni_helpers.h"
284ababd922eac5931e0222862ff082dc29e012816Joe Onorato
294ababd922eac5931e0222862ff082dc29e012816Joe Onorato#define VERSION_1_HEADER 0x01706c48  // 'Hlp'1 little endian
304ababd922eac5931e0222862ff082dc29e012816Joe Onorato
314ababd922eac5931e0222862ff082dc29e012816Joe Onoratonamespace android
324ababd922eac5931e0222862ff082dc29e012816Joe Onorato{
334ababd922eac5931e0222862ff082dc29e012816Joe Onorato
344ababd922eac5931e0222862ff082dc29e012816Joe Onoratostruct chunk_header_v1 {
354ababd922eac5931e0222862ff082dc29e012816Joe Onorato    int headerSize;
364ababd922eac5931e0222862ff082dc29e012816Joe Onorato    int version;
374ababd922eac5931e0222862ff082dc29e012816Joe Onorato    int dataSize; // corresponds to Header.chunkSize
384ababd922eac5931e0222862ff082dc29e012816Joe Onorato    int nameLength; // not including the NULL terminator, which is not written to the file
394ababd922eac5931e0222862ff082dc29e012816Joe Onorato};
404ababd922eac5931e0222862ff082dc29e012816Joe Onorato
414ababd922eac5931e0222862ff082dc29e012816Joe Onoratostatic jfieldID s_chunkSizeField = 0;
424ababd922eac5931e0222862ff082dc29e012816Joe Onoratostatic jfieldID s_keyPrefixField = 0;
434ababd922eac5931e0222862ff082dc29e012816Joe Onorato
4458b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhatstatic jint
454ababd922eac5931e0222862ff082dc29e012816Joe OnoratoreadHeader_native(JNIEnv* env, jobject clazz, jobject headerObj, jobject fdObj)
464ababd922eac5931e0222862ff082dc29e012816Joe Onorato{
474ababd922eac5931e0222862ff082dc29e012816Joe Onorato    chunk_header_v1 flattenedHeader;
484ababd922eac5931e0222862ff082dc29e012816Joe Onorato    ssize_t amt;
494ababd922eac5931e0222862ff082dc29e012816Joe Onorato    String8 keyPrefix;
504ababd922eac5931e0222862ff082dc29e012816Joe Onorato    char* buf;
514ababd922eac5931e0222862ff082dc29e012816Joe Onorato
52a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes    int fd = jniGetFDFromFileDescriptor(env, fdObj);
534ababd922eac5931e0222862ff082dc29e012816Joe Onorato
544ababd922eac5931e0222862ff082dc29e012816Joe Onorato    amt = read(fd, &flattenedHeader.headerSize, sizeof(flattenedHeader.headerSize));
554ababd922eac5931e0222862ff082dc29e012816Joe Onorato    if (amt != sizeof(flattenedHeader.headerSize)) {
5658b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat        return (jint) -1;
574ababd922eac5931e0222862ff082dc29e012816Joe Onorato    }
584ababd922eac5931e0222862ff082dc29e012816Joe Onorato
594ababd922eac5931e0222862ff082dc29e012816Joe Onorato    int remainingHeader = flattenedHeader.headerSize - sizeof(flattenedHeader.headerSize);
604ababd922eac5931e0222862ff082dc29e012816Joe Onorato
614ababd922eac5931e0222862ff082dc29e012816Joe Onorato    if (flattenedHeader.headerSize < (int)sizeof(chunk_header_v1)) {
628564c8da817a845353d213acd8636b76f567b234Steve Block        ALOGW("Skipping unknown header: %d bytes", flattenedHeader.headerSize);
634ababd922eac5931e0222862ff082dc29e012816Joe Onorato        if (remainingHeader > 0) {
644ababd922eac5931e0222862ff082dc29e012816Joe Onorato            lseek(fd, remainingHeader, SEEK_CUR);
654ababd922eac5931e0222862ff082dc29e012816Joe Onorato            // >0 means skip this chunk
6658b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat            return (jint) 1;
674ababd922eac5931e0222862ff082dc29e012816Joe Onorato        }
684ababd922eac5931e0222862ff082dc29e012816Joe Onorato    }
694ababd922eac5931e0222862ff082dc29e012816Joe Onorato
704ababd922eac5931e0222862ff082dc29e012816Joe Onorato    amt = read(fd, &flattenedHeader.version,
714ababd922eac5931e0222862ff082dc29e012816Joe Onorato            sizeof(chunk_header_v1)-sizeof(flattenedHeader.headerSize));
724ababd922eac5931e0222862ff082dc29e012816Joe Onorato    if (amt <= 0) {
738564c8da817a845353d213acd8636b76f567b234Steve Block        ALOGW("Failed reading chunk header");
7458b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat        return (jint) -1;
754ababd922eac5931e0222862ff082dc29e012816Joe Onorato    }
764ababd922eac5931e0222862ff082dc29e012816Joe Onorato    remainingHeader -= sizeof(chunk_header_v1)-sizeof(flattenedHeader.headerSize);
774ababd922eac5931e0222862ff082dc29e012816Joe Onorato
784ababd922eac5931e0222862ff082dc29e012816Joe Onorato    if (flattenedHeader.version != VERSION_1_HEADER) {
798564c8da817a845353d213acd8636b76f567b234Steve Block        ALOGW("Skipping unknown header version: 0x%08x, %d bytes", flattenedHeader.version,
804ababd922eac5931e0222862ff082dc29e012816Joe Onorato                flattenedHeader.headerSize);
814ababd922eac5931e0222862ff082dc29e012816Joe Onorato        if (remainingHeader > 0) {
824ababd922eac5931e0222862ff082dc29e012816Joe Onorato            lseek(fd, remainingHeader, SEEK_CUR);
834ababd922eac5931e0222862ff082dc29e012816Joe Onorato            // >0 means skip this chunk
8458b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat            return (jint) 1;
854ababd922eac5931e0222862ff082dc29e012816Joe Onorato        }
864ababd922eac5931e0222862ff082dc29e012816Joe Onorato    }
874ababd922eac5931e0222862ff082dc29e012816Joe Onorato
8812a4da328a234b171b78cc341544817e9a074057Joe Onorato#if 0
895baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("chunk header:");
905baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("  headerSize=%d", flattenedHeader.headerSize);
915baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("  version=0x%08x", flattenedHeader.version);
925baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("  dataSize=%d", flattenedHeader.dataSize);
935baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("  nameLength=%d", flattenedHeader.nameLength);
9412a4da328a234b171b78cc341544817e9a074057Joe Onorato#endif
9512a4da328a234b171b78cc341544817e9a074057Joe Onorato
964ababd922eac5931e0222862ff082dc29e012816Joe Onorato    if (flattenedHeader.dataSize < 0 || flattenedHeader.nameLength < 0 ||
974ababd922eac5931e0222862ff082dc29e012816Joe Onorato            remainingHeader < flattenedHeader.nameLength) {
988564c8da817a845353d213acd8636b76f567b234Steve Block        ALOGW("Malformed V1 header remainingHeader=%d dataSize=%d nameLength=%d", remainingHeader,
994ababd922eac5931e0222862ff082dc29e012816Joe Onorato                flattenedHeader.dataSize, flattenedHeader.nameLength);
10058b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat        return (jint) -1;
1014ababd922eac5931e0222862ff082dc29e012816Joe Onorato    }
1024ababd922eac5931e0222862ff082dc29e012816Joe Onorato
1034ababd922eac5931e0222862ff082dc29e012816Joe Onorato    buf = keyPrefix.lockBuffer(flattenedHeader.nameLength);
1044ababd922eac5931e0222862ff082dc29e012816Joe Onorato    if (buf == NULL) {
1058564c8da817a845353d213acd8636b76f567b234Steve Block        ALOGW("unable to allocate %d bytes", flattenedHeader.nameLength);
10658b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat        return (jint) -1;
1074ababd922eac5931e0222862ff082dc29e012816Joe Onorato    }
1084ababd922eac5931e0222862ff082dc29e012816Joe Onorato
1094ababd922eac5931e0222862ff082dc29e012816Joe Onorato    amt = read(fd, buf, flattenedHeader.nameLength);
11012a4da328a234b171b78cc341544817e9a074057Joe Onorato    buf[flattenedHeader.nameLength] = 0;
1114ababd922eac5931e0222862ff082dc29e012816Joe Onorato
1124ababd922eac5931e0222862ff082dc29e012816Joe Onorato    keyPrefix.unlockBuffer(flattenedHeader.nameLength);
1134ababd922eac5931e0222862ff082dc29e012816Joe Onorato
1144ababd922eac5931e0222862ff082dc29e012816Joe Onorato    remainingHeader -= flattenedHeader.nameLength;
1154ababd922eac5931e0222862ff082dc29e012816Joe Onorato
1164ababd922eac5931e0222862ff082dc29e012816Joe Onorato    if (remainingHeader > 0) {
1174ababd922eac5931e0222862ff082dc29e012816Joe Onorato        lseek(fd, remainingHeader, SEEK_CUR);
1184ababd922eac5931e0222862ff082dc29e012816Joe Onorato    }
1194ababd922eac5931e0222862ff082dc29e012816Joe Onorato
1204ababd922eac5931e0222862ff082dc29e012816Joe Onorato    env->SetIntField(headerObj, s_chunkSizeField, flattenedHeader.dataSize);
1214ababd922eac5931e0222862ff082dc29e012816Joe Onorato    env->SetObjectField(headerObj, s_keyPrefixField, env->NewStringUTF(keyPrefix.string()));
1224ababd922eac5931e0222862ff082dc29e012816Joe Onorato
12358b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    return (jint) 0;
1244ababd922eac5931e0222862ff082dc29e012816Joe Onorato}
1254ababd922eac5931e0222862ff082dc29e012816Joe Onorato
12658b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhatstatic jint
1274ababd922eac5931e0222862ff082dc29e012816Joe OnoratoskipChunk_native(JNIEnv* env, jobject clazz, jobject fdObj, jint bytesToSkip)
1284ababd922eac5931e0222862ff082dc29e012816Joe Onorato{
129a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes    int fd = jniGetFDFromFileDescriptor(env, fdObj);
1304ababd922eac5931e0222862ff082dc29e012816Joe Onorato
1314ababd922eac5931e0222862ff082dc29e012816Joe Onorato    lseek(fd, bytesToSkip, SEEK_CUR);
1324ababd922eac5931e0222862ff082dc29e012816Joe Onorato
13358b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    return (jint) 0;
1344ababd922eac5931e0222862ff082dc29e012816Joe Onorato}
1354ababd922eac5931e0222862ff082dc29e012816Joe Onorato
1364ababd922eac5931e0222862ff082dc29e012816Joe Onoratostatic int
1374ababd922eac5931e0222862ff082dc29e012816Joe Onoratopadding_len(int len)
1384ababd922eac5931e0222862ff082dc29e012816Joe Onorato{
1394ababd922eac5931e0222862ff082dc29e012816Joe Onorato    len = len % 4;
1404ababd922eac5931e0222862ff082dc29e012816Joe Onorato    return len == 0 ? len : 4 - len;
1414ababd922eac5931e0222862ff082dc29e012816Joe Onorato}
1424ababd922eac5931e0222862ff082dc29e012816Joe Onorato
14358b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhatstatic jint
1444ababd922eac5931e0222862ff082dc29e012816Joe OnoratoallocateHeader_native(JNIEnv* env, jobject clazz, jobject headerObj, jobject fdObj)
1454ababd922eac5931e0222862ff082dc29e012816Joe Onorato{
1464ababd922eac5931e0222862ff082dc29e012816Joe Onorato    int pos;
1474ababd922eac5931e0222862ff082dc29e012816Joe Onorato    jstring nameObj;
1484ababd922eac5931e0222862ff082dc29e012816Joe Onorato    int nameLength;
1494ababd922eac5931e0222862ff082dc29e012816Joe Onorato    int namePadding;
1504ababd922eac5931e0222862ff082dc29e012816Joe Onorato    int headerSize;
1514ababd922eac5931e0222862ff082dc29e012816Joe Onorato
152a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes    int fd = jniGetFDFromFileDescriptor(env, fdObj);
1534ababd922eac5931e0222862ff082dc29e012816Joe Onorato
1544ababd922eac5931e0222862ff082dc29e012816Joe Onorato    nameObj = (jstring)env->GetObjectField(headerObj, s_keyPrefixField);
1554ababd922eac5931e0222862ff082dc29e012816Joe Onorato
1564ababd922eac5931e0222862ff082dc29e012816Joe Onorato    nameLength = env->GetStringUTFLength(nameObj);
1574ababd922eac5931e0222862ff082dc29e012816Joe Onorato    namePadding = padding_len(nameLength);
1584ababd922eac5931e0222862ff082dc29e012816Joe Onorato
1594ababd922eac5931e0222862ff082dc29e012816Joe Onorato    headerSize = sizeof(chunk_header_v1) + nameLength + namePadding;
1604ababd922eac5931e0222862ff082dc29e012816Joe Onorato
1614ababd922eac5931e0222862ff082dc29e012816Joe Onorato    pos = lseek(fd, 0, SEEK_CUR);
1624ababd922eac5931e0222862ff082dc29e012816Joe Onorato
1634ababd922eac5931e0222862ff082dc29e012816Joe Onorato    lseek(fd, headerSize, SEEK_CUR);
164a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes
16558b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    return (jint) pos;
1664ababd922eac5931e0222862ff082dc29e012816Joe Onorato}
1674ababd922eac5931e0222862ff082dc29e012816Joe Onorato
16858b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhatstatic jint
1694ababd922eac5931e0222862ff082dc29e012816Joe OnoratowriteHeader_native(JNIEnv* env, jobject clazz, jobject headerObj, jobject fdObj, jint pos)
1704ababd922eac5931e0222862ff082dc29e012816Joe Onorato{
1714ababd922eac5931e0222862ff082dc29e012816Joe Onorato    int err;
1724ababd922eac5931e0222862ff082dc29e012816Joe Onorato    chunk_header_v1 header;
1734ababd922eac5931e0222862ff082dc29e012816Joe Onorato    int namePadding;
1744ababd922eac5931e0222862ff082dc29e012816Joe Onorato    int prevPos;
1754ababd922eac5931e0222862ff082dc29e012816Joe Onorato    jstring nameObj;
1764ababd922eac5931e0222862ff082dc29e012816Joe Onorato    const char* buf;
1774ababd922eac5931e0222862ff082dc29e012816Joe Onorato
178a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes    int fd = jniGetFDFromFileDescriptor(env, fdObj);
1794ababd922eac5931e0222862ff082dc29e012816Joe Onorato    prevPos = lseek(fd, 0, SEEK_CUR);
1804ababd922eac5931e0222862ff082dc29e012816Joe Onorato
1814ababd922eac5931e0222862ff082dc29e012816Joe Onorato    nameObj = (jstring)env->GetObjectField(headerObj, s_keyPrefixField);
1824ababd922eac5931e0222862ff082dc29e012816Joe Onorato    header.nameLength = env->GetStringUTFLength(nameObj);
1834ababd922eac5931e0222862ff082dc29e012816Joe Onorato    namePadding = padding_len(header.nameLength);
1844ababd922eac5931e0222862ff082dc29e012816Joe Onorato
1854ababd922eac5931e0222862ff082dc29e012816Joe Onorato    header.headerSize = sizeof(chunk_header_v1) + header.nameLength + namePadding;
1864ababd922eac5931e0222862ff082dc29e012816Joe Onorato    header.version = VERSION_1_HEADER;
18712a4da328a234b171b78cc341544817e9a074057Joe Onorato    header.dataSize = prevPos - (pos + header.headerSize);
1884ababd922eac5931e0222862ff082dc29e012816Joe Onorato
1894ababd922eac5931e0222862ff082dc29e012816Joe Onorato    lseek(fd, pos, SEEK_SET);
1904ababd922eac5931e0222862ff082dc29e012816Joe Onorato    err = write(fd, &header, sizeof(chunk_header_v1));
1914ababd922eac5931e0222862ff082dc29e012816Joe Onorato    if (err != sizeof(chunk_header_v1)) {
19258b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat        return (jint) errno;
1934ababd922eac5931e0222862ff082dc29e012816Joe Onorato    }
1944ababd922eac5931e0222862ff082dc29e012816Joe Onorato
1954ababd922eac5931e0222862ff082dc29e012816Joe Onorato    buf = env->GetStringUTFChars(nameObj, NULL);
1964ababd922eac5931e0222862ff082dc29e012816Joe Onorato    err = write(fd, buf, header.nameLength);
1974ababd922eac5931e0222862ff082dc29e012816Joe Onorato    env->ReleaseStringUTFChars(nameObj, buf);
1984ababd922eac5931e0222862ff082dc29e012816Joe Onorato    if (err != header.nameLength) {
19958b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat        return (jint) errno;
2004ababd922eac5931e0222862ff082dc29e012816Joe Onorato    }
2014ababd922eac5931e0222862ff082dc29e012816Joe Onorato
2024ababd922eac5931e0222862ff082dc29e012816Joe Onorato    if (namePadding != 0) {
2034ababd922eac5931e0222862ff082dc29e012816Joe Onorato        int zero = 0;
2044ababd922eac5931e0222862ff082dc29e012816Joe Onorato        err = write(fd, &zero, namePadding);
2054ababd922eac5931e0222862ff082dc29e012816Joe Onorato        if (err != namePadding) {
20658b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat            return (jint) errno;
2074ababd922eac5931e0222862ff082dc29e012816Joe Onorato        }
2084ababd922eac5931e0222862ff082dc29e012816Joe Onorato    }
2094ababd922eac5931e0222862ff082dc29e012816Joe Onorato
2104ababd922eac5931e0222862ff082dc29e012816Joe Onorato    lseek(fd, prevPos, SEEK_SET);
21158b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    return (jint) 0;
2124ababd922eac5931e0222862ff082dc29e012816Joe Onorato}
2134ababd922eac5931e0222862ff082dc29e012816Joe Onorato
2144ababd922eac5931e0222862ff082dc29e012816Joe Onoratostatic const JNINativeMethod g_methods[] = {
2154ababd922eac5931e0222862ff082dc29e012816Joe Onorato    { "readHeader_native",
2164528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tate       "(Landroid/app/backup/BackupHelperDispatcher$Header;Ljava/io/FileDescriptor;)I",
2174ababd922eac5931e0222862ff082dc29e012816Joe Onorato       (void*)readHeader_native },
2184ababd922eac5931e0222862ff082dc29e012816Joe Onorato    { "skipChunk_native",
2194ababd922eac5931e0222862ff082dc29e012816Joe Onorato        "(Ljava/io/FileDescriptor;I)I",
2204ababd922eac5931e0222862ff082dc29e012816Joe Onorato        (void*)skipChunk_native },
2214ababd922eac5931e0222862ff082dc29e012816Joe Onorato    { "allocateHeader_native",
2224528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tate        "(Landroid/app/backup/BackupHelperDispatcher$Header;Ljava/io/FileDescriptor;)I",
2234ababd922eac5931e0222862ff082dc29e012816Joe Onorato        (void*)allocateHeader_native },
2244ababd922eac5931e0222862ff082dc29e012816Joe Onorato    { "writeHeader_native",
2254528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tate       "(Landroid/app/backup/BackupHelperDispatcher$Header;Ljava/io/FileDescriptor;I)I",
2264ababd922eac5931e0222862ff082dc29e012816Joe Onorato       (void*)writeHeader_native },
2274ababd922eac5931e0222862ff082dc29e012816Joe Onorato};
2284ababd922eac5931e0222862ff082dc29e012816Joe Onorato
2294ababd922eac5931e0222862ff082dc29e012816Joe Onoratoint register_android_backup_BackupHelperDispatcher(JNIEnv* env)
2304ababd922eac5931e0222862ff082dc29e012816Joe Onorato{
231987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    jclass clazz = FindClassOrDie(env, "android/app/backup/BackupHelperDispatcher$Header");
232987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    s_chunkSizeField = GetFieldIDOrDie(env, clazz, "chunkSize", "I");
233987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    s_keyPrefixField = GetFieldIDOrDie(env, clazz, "keyPrefix", "Ljava/lang/String;");
234987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe
235987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    return RegisterMethodsOrDie(env, "android/app/backup/BackupHelperDispatcher", g_methods,
236987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe                                NELEM(g_methods));
2374ababd922eac5931e0222862ff082dc29e012816Joe Onorato}
2384ababd922eac5931e0222862ff082dc29e012816Joe Onorato
2394ababd922eac5931e0222862ff082dc29e012816Joe Onorato}
240