android_content_res_ObbScanner.cpp revision 05105f7abe02b2dff91d6260b3628c8b97816bab
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> 2102c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root#include <utils/ObbFile.h> 2202c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 2302c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root#include "jni.h" 2402c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root#include "utils/misc.h" 2502c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root#include "android_runtime/AndroidRuntime.h" 2602c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 2702c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Rootnamespace android { 2802c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 2902c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Rootstatic struct { 3002c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root jclass clazz; 3102c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 3202c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root jfieldID packageName; 3302c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root jfieldID version; 3402ca31fbae9f35dd30f79de6927fae11b549391aKenny Root jfieldID flags; 3502c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root} gObbInfoClassInfo; 3602c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 3705105f7abe02b2dff91d6260b3628c8b97816babKenny Rootstatic void doThrow(JNIEnv* env, const char* exc, const char* msg = NULL) 3805105f7abe02b2dff91d6260b3628c8b97816babKenny Root{ 3905105f7abe02b2dff91d6260b3628c8b97816babKenny Root jclass npeClazz; 4005105f7abe02b2dff91d6260b3628c8b97816babKenny Root 4105105f7abe02b2dff91d6260b3628c8b97816babKenny Root npeClazz = env->FindClass(exc); 4205105f7abe02b2dff91d6260b3628c8b97816babKenny Root LOG_FATAL_IF(npeClazz == NULL, "Unable to find class %s", exc); 4305105f7abe02b2dff91d6260b3628c8b97816babKenny Root 4405105f7abe02b2dff91d6260b3628c8b97816babKenny Root env->ThrowNew(npeClazz, msg); 4505105f7abe02b2dff91d6260b3628c8b97816babKenny Root} 4605105f7abe02b2dff91d6260b3628c8b97816babKenny Root 4705105f7abe02b2dff91d6260b3628c8b97816babKenny Rootstatic void android_content_res_ObbScanner_getObbInfo(JNIEnv* env, jobject clazz, jstring file, 4802c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root jobject obbInfo) 4902c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root{ 5002c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root const char* filePath = env->GetStringUTFChars(file, JNI_FALSE); 5102c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 5202c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root sp<ObbFile> obb = new ObbFile(); 5302c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root if (!obb->readFrom(filePath)) { 5402c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root env->ReleaseStringUTFChars(file, filePath); 5505105f7abe02b2dff91d6260b3628c8b97816babKenny Root doThrow(env, "java/io/IOException", "Could not read OBB file"); 5605105f7abe02b2dff91d6260b3628c8b97816babKenny Root return; 5702c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root } 5802c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 5902c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root env->ReleaseStringUTFChars(file, filePath); 6002c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 6102c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root const char* packageNameStr = obb->getPackageName().string(); 6202c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 6302c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root jstring packageName = env->NewStringUTF(packageNameStr); 6402c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root if (packageName == NULL) { 6505105f7abe02b2dff91d6260b3628c8b97816babKenny Root doThrow(env, "java/io/IOException", "Could not read OBB file"); 6605105f7abe02b2dff91d6260b3628c8b97816babKenny Root return; 6702c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root } 6802c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 6902c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root env->SetObjectField(obbInfo, gObbInfoClassInfo.packageName, packageName); 7002c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root env->SetIntField(obbInfo, gObbInfoClassInfo.version, obb->getVersion()); 7105105f7abe02b2dff91d6260b3628c8b97816babKenny Root env->SetIntField(obbInfo, gObbInfoClassInfo.flags, obb->getFlags()); 7202c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root} 7302c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 7402c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root/* 7502c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root * JNI registration. 7602c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root */ 7702c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Rootstatic JNINativeMethod gMethods[] = { 7802c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root /* name, signature, funcPtr */ 7905105f7abe02b2dff91d6260b3628c8b97816babKenny Root { "getObbInfo_native", "(Ljava/lang/String;Landroid/content/res/ObbInfo;)V", 8002c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root (void*) android_content_res_ObbScanner_getObbInfo }, 8102c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root}; 8202c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 8302c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root#define FIND_CLASS(var, className) \ 8402c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root var = env->FindClass(className); \ 8502c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root LOG_FATAL_IF(! var, "Unable to find class " className); \ 8602c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root var = jclass(env->NewGlobalRef(var)); 8702c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 8802c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root#define GET_FIELD_ID(var, clazz, fieldName, fieldDescriptor) \ 8902c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root var = env->GetFieldID(clazz, fieldName, fieldDescriptor); \ 9002c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root LOG_FATAL_IF(! var, "Unable to find field " fieldName); 9102c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 9202c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Rootint register_android_content_res_ObbScanner(JNIEnv* env) 9302c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root{ 9402c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root FIND_CLASS(gObbInfoClassInfo.clazz, "android/content/res/ObbInfo"); 9502c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 9602c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root GET_FIELD_ID(gObbInfoClassInfo.packageName, gObbInfoClassInfo.clazz, 9702c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root "packageName", "Ljava/lang/String;"); 9802c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root GET_FIELD_ID(gObbInfoClassInfo.version, gObbInfoClassInfo.clazz, 9902c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root "version", "I"); 10002ca31fbae9f35dd30f79de6927fae11b549391aKenny Root GET_FIELD_ID(gObbInfoClassInfo.flags, gObbInfoClassInfo.clazz, 10102ca31fbae9f35dd30f79de6927fae11b549391aKenny Root "flags", "I"); 10202c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 10302c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root return AndroidRuntime::registerNativeMethods(env, "android/content/res/ObbScanner", gMethods, 10402c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root NELEM(gMethods)); 10502c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root} 10602c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 10702c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root}; // namespace android 10802c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 109