android_content_res_ObbScanner.cpp revision 02c8730c1bf19daf48bec8c6995df676a00a73b1
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; 3402c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root} gObbInfoClassInfo; 3502c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 3602c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Rootstatic jboolean android_content_res_ObbScanner_getObbInfo(JNIEnv* env, jobject clazz, jstring file, 3702c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root jobject obbInfo) 3802c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root{ 3902c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root const char* filePath = env->GetStringUTFChars(file, JNI_FALSE); 4002c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 4102c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root sp<ObbFile> obb = new ObbFile(); 4202c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root if (!obb->readFrom(filePath)) { 4302c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root env->ReleaseStringUTFChars(file, filePath); 4402c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root return JNI_FALSE; 4502c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root } 4602c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 4702c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root env->ReleaseStringUTFChars(file, filePath); 4802c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 4902c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root const char* packageNameStr = obb->getPackageName().string(); 5002c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 5102c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root jstring packageName = env->NewStringUTF(packageNameStr); 5202c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root if (packageName == NULL) { 5302c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root return JNI_FALSE; 5402c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root } 5502c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 5602c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root env->SetObjectField(obbInfo, gObbInfoClassInfo.packageName, packageName); 5702c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root env->SetIntField(obbInfo, gObbInfoClassInfo.version, obb->getVersion()); 5802c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 5902c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root return JNI_TRUE; 6002c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root} 6102c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 6202c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root/* 6302c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root * JNI registration. 6402c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root */ 6502c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Rootstatic JNINativeMethod gMethods[] = { 6602c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root /* name, signature, funcPtr */ 6702c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root { "getObbInfo_native", "(Ljava/lang/String;Landroid/content/res/ObbInfo;)Z", 6802c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root (void*) android_content_res_ObbScanner_getObbInfo }, 6902c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root}; 7002c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 7102c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root#define FIND_CLASS(var, className) \ 7202c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root var = env->FindClass(className); \ 7302c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root LOG_FATAL_IF(! var, "Unable to find class " className); \ 7402c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root var = jclass(env->NewGlobalRef(var)); 7502c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 7602c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root#define GET_FIELD_ID(var, clazz, fieldName, fieldDescriptor) \ 7702c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root var = env->GetFieldID(clazz, fieldName, fieldDescriptor); \ 7802c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root LOG_FATAL_IF(! var, "Unable to find field " fieldName); 7902c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 8002c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Rootint register_android_content_res_ObbScanner(JNIEnv* env) 8102c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root{ 8202c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root FIND_CLASS(gObbInfoClassInfo.clazz, "android/content/res/ObbInfo"); 8302c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 8402c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root GET_FIELD_ID(gObbInfoClassInfo.packageName, gObbInfoClassInfo.clazz, 8502c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root "packageName", "Ljava/lang/String;"); 8602c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root GET_FIELD_ID(gObbInfoClassInfo.version, gObbInfoClassInfo.clazz, 8702c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root "version", "I"); 8802c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 8902c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root return AndroidRuntime::registerNativeMethods(env, "android/content/res/ObbScanner", gMethods, 9002c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root NELEM(gMethods)); 9102c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root} 9202c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 9302c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root}; // namespace android 9402c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root 95