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