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