diff options
author | Kenny Root <kroot@google.com> | 2010-07-01 08:10:18 -0700 |
---|---|---|
committer | Kenny Root <kroot@google.com> | 2010-07-15 21:31:58 -0700 |
commit | 02c8730c1bf19daf48bec8c6995df676a00a73b1 (patch) | |
tree | f4d832a5308a18272cc6be0464a9824ad1e776ec /core/jni/android_content_res_ObbScanner.cpp | |
parent | c5ed5910c9ef066cec6a13bbb404ec57b1e92637 (diff) | |
download | frameworks_base-02c8730c1bf19daf48bec8c6995df676a00a73b1.zip frameworks_base-02c8730c1bf19daf48bec8c6995df676a00a73b1.tar.gz frameworks_base-02c8730c1bf19daf48bec8c6995df676a00a73b1.tar.bz2 |
Add API to call to vold for mounting OBBs
* Unhide StorageService class; hide all the USB-related items
* Add application-visible API to StorageManager for OBB files
* Add class for parceling OBB info across binders (ObbInfo)
* Add a JNI glue class to libutils/ObbFile (ObbScanner)
* Add API to MountService to deal with calling into vold and checking
permissions
Change-Id: I33ecf9606b8ff535f3a2ada83931da6bbef41cfd
Diffstat (limited to 'core/jni/android_content_res_ObbScanner.cpp')
-rw-r--r-- | core/jni/android_content_res_ObbScanner.cpp | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/core/jni/android_content_res_ObbScanner.cpp b/core/jni/android_content_res_ObbScanner.cpp new file mode 100644 index 0000000..1239274 --- /dev/null +++ b/core/jni/android_content_res_ObbScanner.cpp @@ -0,0 +1,94 @@ +/* + * Copyright 2010, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define LOG_TAG "ObbScanner" + +#include <utils/Log.h> +#include <utils/String8.h> +#include <utils/ObbFile.h> + +#include "jni.h" +#include "utils/misc.h" +#include "android_runtime/AndroidRuntime.h" + +namespace android { + +static struct { + jclass clazz; + + jfieldID packageName; + jfieldID version; +} gObbInfoClassInfo; + +static jboolean android_content_res_ObbScanner_getObbInfo(JNIEnv* env, jobject clazz, jstring file, + jobject obbInfo) +{ + const char* filePath = env->GetStringUTFChars(file, JNI_FALSE); + + sp<ObbFile> obb = new ObbFile(); + if (!obb->readFrom(filePath)) { + env->ReleaseStringUTFChars(file, filePath); + return JNI_FALSE; + } + + env->ReleaseStringUTFChars(file, filePath); + + const char* packageNameStr = obb->getPackageName().string(); + + jstring packageName = env->NewStringUTF(packageNameStr); + if (packageName == NULL) { + return JNI_FALSE; + } + + env->SetObjectField(obbInfo, gObbInfoClassInfo.packageName, packageName); + env->SetIntField(obbInfo, gObbInfoClassInfo.version, obb->getVersion()); + + return JNI_TRUE; +} + +/* + * JNI registration. + */ +static JNINativeMethod gMethods[] = { + /* name, signature, funcPtr */ + { "getObbInfo_native", "(Ljava/lang/String;Landroid/content/res/ObbInfo;)Z", + (void*) android_content_res_ObbScanner_getObbInfo }, +}; + +#define FIND_CLASS(var, className) \ + var = env->FindClass(className); \ + LOG_FATAL_IF(! var, "Unable to find class " className); \ + var = jclass(env->NewGlobalRef(var)); + +#define GET_FIELD_ID(var, clazz, fieldName, fieldDescriptor) \ + var = env->GetFieldID(clazz, fieldName, fieldDescriptor); \ + LOG_FATAL_IF(! var, "Unable to find field " fieldName); + +int register_android_content_res_ObbScanner(JNIEnv* env) +{ + FIND_CLASS(gObbInfoClassInfo.clazz, "android/content/res/ObbInfo"); + + GET_FIELD_ID(gObbInfoClassInfo.packageName, gObbInfoClassInfo.clazz, + "packageName", "Ljava/lang/String;"); + GET_FIELD_ID(gObbInfoClassInfo.version, gObbInfoClassInfo.clazz, + "version", "I"); + + return AndroidRuntime::registerNativeMethods(env, "android/content/res/ObbScanner", gMethods, + NELEM(gMethods)); +} + +}; // namespace android + |