1 /* 2 * Copyright (C) 2009 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #define LOG_TAG "FileBackupHelper_native" 18 #include <utils/Log.h> 19 20 #include "JNIHelp.h" 21 #include <android_runtime/AndroidRuntime.h> 22 23 #include <utils/BackupHelpers.h> 24 25 namespace android 26 { 27 28 static int 29 ctor_native(JNIEnv* env, jobject clazz, jobject fileDescriptor) 30 { 31 int fd = jniGetFDFromFileDescriptor(env, fileDescriptor); 32 if (fd == -1) { 33 return NULL; 34 } 35 36 return (int)new BackupDataWriter(fd); 37 } 38 39 static void 40 dtor_native(JNIEnv* env, jobject clazz, int w) 41 { 42 delete (BackupDataWriter*)w; 43 } 44 45 static jint 46 writeEntityHeader_native(JNIEnv* env, jobject clazz, int w, jstring key, int dataSize) 47 { 48 int err; 49 BackupDataWriter* writer = (BackupDataWriter*)w; 50 51 const char* keyUTF = env->GetStringUTFChars(key, NULL); 52 if (keyUTF == NULL) { 53 return -1; 54 } 55 56 err = writer->WriteEntityHeader(String8(keyUTF), dataSize); 57 58 env->ReleaseStringUTFChars(key, keyUTF); 59 60 return err; 61 } 62 63 static jint 64 writeEntityData_native(JNIEnv* env, jobject clazz, int w, jbyteArray data, int size) 65 { 66 int err; 67 BackupDataWriter* writer = (BackupDataWriter*)w; 68 69 if (env->GetArrayLength(data) < size) { 70 // size mismatch 71 return -1; 72 } 73 74 jbyte* dataBytes = env->GetByteArrayElements(data, NULL); 75 if (dataBytes == NULL) { 76 return -1; 77 } 78 79 err = writer->WriteEntityData(dataBytes, size); 80 81 env->ReleaseByteArrayElements(data, dataBytes, JNI_ABORT); 82 83 return err; 84 } 85 86 static void 87 setKeyPrefix_native(JNIEnv* env, jobject clazz, int w, jstring keyPrefixObj) 88 { 89 int err; 90 BackupDataWriter* writer = (BackupDataWriter*)w; 91 92 const char* keyPrefixUTF = env->GetStringUTFChars(keyPrefixObj, NULL); 93 String8 keyPrefix(keyPrefixUTF ? keyPrefixUTF : ""); 94 95 writer->SetKeyPrefix(keyPrefix); 96 97 env->ReleaseStringUTFChars(keyPrefixObj, keyPrefixUTF); 98 } 99 100 static const JNINativeMethod g_methods[] = { 101 { "ctor", "(Ljava/io/FileDescriptor;)I", (void*)ctor_native }, 102 { "dtor", "(I)V", (void*)dtor_native }, 103 { "writeEntityHeader_native", "(ILjava/lang/String;I)I", (void*)writeEntityHeader_native }, 104 { "writeEntityData_native", "(I[BI)I", (void*)writeEntityData_native }, 105 { "setKeyPrefix_native", "(ILjava/lang/String;)V", (void*)setKeyPrefix_native }, 106 }; 107 108 int register_android_backup_BackupDataOutput(JNIEnv* env) 109 { 110 //LOGD("register_android_backup_BackupDataOutput"); 111 return AndroidRuntime::registerNativeMethods(env, "android/app/backup/BackupDataOutput", 112 g_methods, NELEM(g_methods)); 113 } 114 115 } 116