102c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root/* 202c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root * Copyright 2010, The Android Open Source Project 302c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root * 402c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root * Licensed under the Apache License, Version 2.0 (the "License"); 502c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root * you may not use this file except in compliance with the License. 602c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root * You may obtain a copy of the License at 702c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root * 802c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root * http://www.apache.org/licenses/LICENSE-2.0 902c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root * 1002c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root * Unless required by applicable law or agreed to in writing, software 1102c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root * distributed under the License is distributed on an "AS IS" BASIS, 1202c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1302c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root * See the License for the specific language governing permissions and 1402c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root * limitations under the License. 1502c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root */ 1602c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 1702c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root#define LOG_TAG "ObbScanner" 1802c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 1902c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root#include <utils/Log.h> 2002c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root#include <utils/String8.h> 21b13b9bdad2baf6ad1ec2e56b6b7598fa20f55fc4Mathias Agopian#include <androidfw/ObbFile.h> 2202c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 2302c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root#include "jni.h" 242279b2534272282a5b5152723235da397e49195cSteven Moreland#include <nativehelper/JNIHelp.h> 2502c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root#include "utils/misc.h" 2602c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root#include "android_runtime/AndroidRuntime.h" 2702c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 28987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe#include "core_jni_helpers.h" 29987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe 3002c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Rootnamespace android { 3102c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 3202c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Rootstatic struct { 3302c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root jclass clazz; 3402c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 3502c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root jfieldID packageName; 3602c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root jfieldID version; 3702ca31fbae9f35dd30f79de6927fae11b549391aKenny Root jfieldID flags; 383b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root jfieldID salt; 3902c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root} gObbInfoClassInfo; 4002c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 4105105f7abe02b2dff91d6260b3628c8b97816babKenny Rootstatic void android_content_res_ObbScanner_getObbInfo(JNIEnv* env, jobject clazz, jstring file, 4202c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root jobject obbInfo) 4302c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root{ 44dd66bcbf9d6ef0c50a18d9c4b1b39ce7ef7afcc4Elliott Hughes const char* filePath = env->GetStringUTFChars(file, NULL); 4502c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 4602c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root sp<ObbFile> obb = new ObbFile(); 4702c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root if (!obb->readFrom(filePath)) { 4802c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root env->ReleaseStringUTFChars(file, filePath); 498451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes jniThrowException(env, "java/io/IOException", "Could not read OBB file"); 5005105f7abe02b2dff91d6260b3628c8b97816babKenny Root return; 5102c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root } 5202c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 5302c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root env->ReleaseStringUTFChars(file, filePath); 5402c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 5502c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root const char* packageNameStr = obb->getPackageName().string(); 5602c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 5702c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root jstring packageName = env->NewStringUTF(packageNameStr); 5802c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root if (packageName == NULL) { 598451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes jniThrowException(env, "java/io/IOException", "Could not read OBB file"); 6005105f7abe02b2dff91d6260b3628c8b97816babKenny Root return; 6102c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root } 6202c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 6302c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root env->SetObjectField(obbInfo, gObbInfoClassInfo.packageName, packageName); 6402c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root env->SetIntField(obbInfo, gObbInfoClassInfo.version, obb->getVersion()); 6505105f7abe02b2dff91d6260b3628c8b97816babKenny Root env->SetIntField(obbInfo, gObbInfoClassInfo.flags, obb->getFlags()); 663b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root 673b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root size_t saltLen; 683b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root const unsigned char* salt = obb->getSalt(&saltLen); 693b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root if (saltLen > 0) { 703b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root jbyteArray saltArray = env->NewByteArray(saltLen); 713b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root env->SetByteArrayRegion(saltArray, 0, saltLen, (jbyte*)salt); 723b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root env->SetObjectField(obbInfo, gObbInfoClassInfo.salt, saltArray); 733b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root } 7402c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root} 7502c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 7602c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root/* 7702c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root * JNI registration. 7802c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root */ 7976f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod gMethods[] = { 8002c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root /* name, signature, funcPtr */ 8105105f7abe02b2dff91d6260b3628c8b97816babKenny Root { "getObbInfo_native", "(Ljava/lang/String;Landroid/content/res/ObbInfo;)V", 8202c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root (void*) android_content_res_ObbScanner_getObbInfo }, 8302c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root}; 8402c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 8502c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Rootint register_android_content_res_ObbScanner(JNIEnv* env) 8602c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root{ 87987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe jclass clazz = FindClassOrDie(env, "android/content/res/ObbInfo"); 88987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe 89987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gObbInfoClassInfo.packageName = GetFieldIDOrDie(env, clazz, "packageName", 90987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe "Ljava/lang/String;"); 91987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gObbInfoClassInfo.version = GetFieldIDOrDie(env, clazz, "version", "I"); 92987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gObbInfoClassInfo.flags = GetFieldIDOrDie(env, clazz, "flags", "I"); 93987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gObbInfoClassInfo.salt = GetFieldIDOrDie(env, clazz, "salt", "[B"); 94987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe 95987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe return RegisterMethodsOrDie(env, "android/content/res/ObbScanner", gMethods, NELEM(gMethods)); 9602c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root} 9702c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 9802c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root}; // namespace android 99