android_util_AssetManager.cpp revision 896043d67d3ac75760bd99db8a1561e31ebee1e1
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* //device/libs/android_runtime/android_util_AssetManager.cpp
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Copyright 2006, The Android Open Source Project
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes** Licensed under the Apache License, Version 2.0 (the "License");
669a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes** you may not use this file except in compliance with the License.
769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes** You may obtain a copy of the License at
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
969a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes**     http://www.apache.org/licenses/LICENSE-2.0
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
1169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes** Unless required by applicable law or agreed to in writing, software
1269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes** distributed under the License is distributed on an "AS IS" BASIS,
1369a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1469a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes** See the License for the specific language governing permissions and
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** limitations under the License.
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project*/
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_TAG "asset"
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn#define DEBUG_STYLES(x) //x
2120cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#define THROW_ON_BAD_ID 0
22b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <android_runtime/android_util_AssetManager.h>
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "jni.h"
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "JNIHelp.h"
2769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes#include "ScopedStringChars.h"
2869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes#include "ScopedUtfChars.h"
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "android_util_Binder.h"
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/misc.h>
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <android_runtime/AndroidRuntime.h>
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Log.h>
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34b13b9bdad2baf6ad1ec2e56b6b7598fa20f55fc4Mathias Agopian#include <androidfw/Asset.h>
35b13b9bdad2baf6ad1ec2e56b6b7598fa20f55fc4Mathias Agopian#include <androidfw/AssetManager.h>
36b13b9bdad2baf6ad1ec2e56b6b7598fa20f55fc4Mathias Agopian#include <androidfw/ResourceTypes.h>
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h>
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct typedvalue_offsets_t
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jfieldID mType;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jfieldID mData;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jfieldID mString;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jfieldID mAssetCookie;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jfieldID mResourceId;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jfieldID mChangingConfigurations;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jfieldID mDensity;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} gTypedValueOffsets;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct assetfiledescriptor_offsets_t
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jfieldID mFd;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jfieldID mStartOffset;
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jfieldID mLength;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} gAssetFileDescriptorOffsets;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct assetmanager_offsets_t
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jfieldID mObject;
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} gAssetManagerOffsets;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjclass g_stringClass = NULL;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectenum {
720d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn    STYLE_NUM_ENTRIES = 6,
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    STYLE_TYPE = 0,
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    STYLE_DATA = 1,
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    STYLE_ASSET_COOKIE = 2,
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    STYLE_RESOURCE_ID = 3,
770d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn    STYLE_CHANGING_CONFIGURATIONS = 4,
780d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn    STYLE_DENSITY = 5
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint copyValue(JNIEnv* env, jobject outValue, const ResTable* table,
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      const Res_value& value, uint32_t ref, ssize_t block,
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      uint32_t typeSpecFlags, ResTable_config* config = NULL);
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjint copyValue(JNIEnv* env, jobject outValue, const ResTable* table,
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               const Res_value& value, uint32_t ref, ssize_t block,
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               uint32_t typeSpecFlags, ResTable_config* config)
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->SetIntField(outValue, gTypedValueOffsets.mType, value.dataType);
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->SetIntField(outValue, gTypedValueOffsets.mAssetCookie,
91896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat                     static_cast<jint>(table->getTableCookie(block)));
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->SetIntField(outValue, gTypedValueOffsets.mData, value.data);
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->SetObjectField(outValue, gTypedValueOffsets.mString, NULL);
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->SetIntField(outValue, gTypedValueOffsets.mResourceId, ref);
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->SetIntField(outValue, gTypedValueOffsets.mChangingConfigurations,
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            typeSpecFlags);
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (config != NULL) {
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        env->SetIntField(outValue, gTypedValueOffsets.mDensity, config->density);
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return block;
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// this guy is exported to other jni routines
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectAssetManager* assetManagerForJavaObject(JNIEnv* env, jobject obj)
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
108896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    jlong amHandle = env->GetLongField(obj, gAssetManagerOffsets.mObject);
109896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    AssetManager* am = reinterpret_cast<AssetManager*>(amHandle);
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am != NULL) {
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return am;
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jniThrowException(env, "java/lang/IllegalStateException", "AssetManager has been finalized!");
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return NULL;
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
117896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhatstatic jlong android_content_AssetManager_openAsset(JNIEnv* env, jobject clazz,
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                jstring fileName, jint mode)
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12571f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("openAsset in %p (Java object %p)\n", am, clazz);
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    ScopedUtfChars fileName8(env, fileName);
12869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    if (fileName8.c_str() == NULL) {
129896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat        jniThrowException(env, "java/lang/IllegalArgumentException", "Empty file name");
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mode != Asset::ACCESS_UNKNOWN && mode != Asset::ACCESS_RANDOM
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        && mode != Asset::ACCESS_STREAMING && mode != Asset::ACCESS_BUFFER) {
1354d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne        jniThrowException(env, "java/lang/IllegalArgumentException", "Bad access mode");
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13969a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    Asset* a = am->open(fileName8.c_str(), (Asset::AccessMode)mode);
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (a == NULL) {
14269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        jniThrowException(env, "java/io/FileNotFoundException", fileName8.c_str());
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //printf("Created Asset Stream: %p\n", a);
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
148896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    return reinterpret_cast<jlong>(a);
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jobject returnParcelFileDescriptor(JNIEnv* env, Asset* a, jlongArray outOffsets)
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
153ddb76c4644756b31be948d70aaa8ee541dd94999Kenny Root    off64_t startOffset, length;
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int fd = a->openFileDescriptor(&startOffset, &length);
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    delete a;
15669a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (fd < 0) {
1584d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne        jniThrowException(env, "java/io/FileNotFoundException",
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "This file can not be opened as a file descriptor; it is probably compressed");
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jlong* offsets = (jlong*)env->GetPrimitiveArrayCritical(outOffsets, 0);
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (offsets == NULL) {
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        close(fd);
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    offsets[0] = startOffset;
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    offsets[1] = length;
17169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->ReleasePrimitiveArrayCritical(outOffsets, offsets, 0);
17369a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
174a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes    jobject fileDesc = jniCreateFileDescriptor(env, fd);
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (fileDesc == NULL) {
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        close(fd);
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17969a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return newParcelFileDescriptor(env, fileDesc);
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jobject android_content_AssetManager_openAssetFd(JNIEnv* env, jobject clazz,
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                jstring fileName, jlongArray outOffsets)
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19171f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("openAssetFd in %p (Java object %p)\n", am, clazz);
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19369a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    ScopedUtfChars fileName8(env, fileName);
19469a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    if (fileName8.c_str() == NULL) {
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    Asset* a = am->open(fileName8.c_str(), Asset::ACCESS_RANDOM);
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (a == NULL) {
20169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        jniThrowException(env, "java/io/FileNotFoundException", fileName8.c_str());
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //printf("Created Asset Stream: %p\n", a);
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return returnParcelFileDescriptor(env, a, outOffsets);
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
210896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhatstatic jlong android_content_AssetManager_openNonAssetNative(JNIEnv* env, jobject clazz,
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                         jint cookie,
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                         jstring fileName,
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                         jint mode)
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22071f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("openNonAssetNative in %p (Java object %p)\n", am, clazz);
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    ScopedUtfChars fileName8(env, fileName);
22369a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    if (fileName8.c_str() == NULL) {
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mode != Asset::ACCESS_UNKNOWN && mode != Asset::ACCESS_RANDOM
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        && mode != Asset::ACCESS_STREAMING && mode != Asset::ACCESS_BUFFER) {
2294d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne        jniThrowException(env, "java/lang/IllegalArgumentException", "Bad access mode");
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Asset* a = cookie
234745d4efc8369d255341d810790132660e33d3b61Narayan Kamath        ? am->openNonAsset(static_cast<int32_t>(cookie), fileName8.c_str(),
235745d4efc8369d255341d810790132660e33d3b61Narayan Kamath                (Asset::AccessMode)mode)
23669a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        : am->openNonAsset(fileName8.c_str(), (Asset::AccessMode)mode);
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (a == NULL) {
23969a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        jniThrowException(env, "java/io/FileNotFoundException", fileName8.c_str());
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //printf("Created Asset Stream: %p\n", a);
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
245896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    return reinterpret_cast<jlong>(a);
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jobject android_content_AssetManager_openNonAssetFdNative(JNIEnv* env, jobject clazz,
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                         jint cookie,
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                         jstring fileName,
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                         jlongArray outOffsets)
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25871f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("openNonAssetFd in %p (Java object %p)\n", am, clazz);
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26069a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    ScopedUtfChars fileName8(env, fileName);
26169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    if (fileName8.c_str() == NULL) {
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Asset* a = cookie
266745d4efc8369d255341d810790132660e33d3b61Narayan Kamath        ? am->openNonAsset(static_cast<int32_t>(cookie), fileName8.c_str(), Asset::ACCESS_RANDOM)
26769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        : am->openNonAsset(fileName8.c_str(), Asset::ACCESS_RANDOM);
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (a == NULL) {
27069a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        jniThrowException(env, "java/io/FileNotFoundException", fileName8.c_str());
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //printf("Created Asset Stream: %p\n", a);
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return returnParcelFileDescriptor(env, a, outOffsets);
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jobjectArray android_content_AssetManager_list(JNIEnv* env, jobject clazz,
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                   jstring fileName)
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    ScopedUtfChars fileName8(env, fileName);
28869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    if (fileName8.c_str() == NULL) {
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    AssetDir* dir = am->openDir(fileName8.c_str());
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (dir == NULL) {
29569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        jniThrowException(env, "java/io/FileNotFoundException", fileName8.c_str());
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t N = dir->getFileCount();
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jobjectArray array = env->NewObjectArray(dir->getFileCount(),
302aa5fe3d206f72c4e7ff6632e169de2d0df6672e2Vladimir Marko                                                g_stringClass, NULL);
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (array == NULL) {
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        delete dir;
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (size_t i=0; i<N; i++) {
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const String8& name = dir->getFileName(i);
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jstring str = env->NewStringUTF(name.string());
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str == NULL) {
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            delete dir;
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NULL;
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        env->SetObjectArrayElement(array, i, str);
3164d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne        env->DeleteLocalRef(str);
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    delete dir;
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return array;
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_content_AssetManager_destroyAsset(JNIEnv* env, jobject clazz,
325896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat                                                      jlong assetHandle)
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
327896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    Asset* a = reinterpret_cast<Asset*>(assetHandle);
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //printf("Destroying Asset Stream: %p\n", a);
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (a == NULL) {
33269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        jniThrowNullPointerException(env, "asset");
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    delete a;
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_content_AssetManager_readAssetChar(JNIEnv* env, jobject clazz,
340896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat                                                       jlong assetHandle)
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
342896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    Asset* a = reinterpret_cast<Asset*>(assetHandle);
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (a == NULL) {
34569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        jniThrowNullPointerException(env, "asset");
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint8_t b;
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ssize_t res = a->read(&b, 1);
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return res == 1 ? b : -1;
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_content_AssetManager_readAsset(JNIEnv* env, jobject clazz,
355896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat                                                jlong assetHandle, jbyteArray bArray,
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                jint off, jint len)
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
358896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    Asset* a = reinterpret_cast<Asset*>(assetHandle);
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (a == NULL || bArray == NULL) {
36169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        jniThrowNullPointerException(env, "asset");
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (len == 0) {
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
36869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jsize bLen = env->GetArrayLength(bArray);
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (off < 0 || off >= bLen || len < 0 || len > bLen || (off+len) > bLen) {
3714d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne        jniThrowException(env, "java/lang/IndexOutOfBoundsException", "");
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jbyte* b = env->GetByteArrayElements(bArray, NULL);
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ssize_t res = a->read(b+off, len);
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->ReleaseByteArrayElements(bArray, b, 0);
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
379896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    if (res > 0) return static_cast<jint>(res);
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (res < 0) {
3824d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne        jniThrowException(env, "java/io/IOException", "");
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return -1;
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jlong android_content_AssetManager_seekAsset(JNIEnv* env, jobject clazz,
388896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat                                                 jlong assetHandle,
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                 jlong offset, jint whence)
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
391896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    Asset* a = reinterpret_cast<Asset*>(assetHandle);
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (a == NULL) {
39469a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        jniThrowNullPointerException(env, "asset");
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return a->seek(
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        offset, (whence > 0) ? SEEK_END : (whence < 0 ? SEEK_SET : SEEK_CUR));
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jlong android_content_AssetManager_getAssetLength(JNIEnv* env, jobject clazz,
403896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat                                                      jlong assetHandle)
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
405896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    Asset* a = reinterpret_cast<Asset*>(assetHandle);
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (a == NULL) {
40869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        jniThrowNullPointerException(env, "asset");
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return a->getLength();
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jlong android_content_AssetManager_getAssetRemainingLength(JNIEnv* env, jobject clazz,
416896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat                                                               jlong assetHandle)
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
418896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    Asset* a = reinterpret_cast<Asset*>(assetHandle);
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (a == NULL) {
42169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        jniThrowNullPointerException(env, "asset");
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return a->getRemainingLength();
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_content_AssetManager_addAssetPath(JNIEnv* env, jobject clazz,
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                       jstring path)
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
43169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    ScopedUtfChars path8(env, path);
43269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    if (path8.c_str() == NULL) {
433129e19cb37b1d30f8c46f77a3853d347c3e78bb3Glenn Kasten        return 0;
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
438129e19cb37b1d30f8c46f77a3853d347c3e78bb3Glenn Kasten        return 0;
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
441745d4efc8369d255341d810790132660e33d3b61Narayan Kamath    int32_t cookie;
44269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    bool res = am->addAssetPath(String8(path8.c_str()), &cookie);
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
444745d4efc8369d255341d810790132660e33d3b61Narayan Kamath    return (res) ? static_cast<jint>(cookie) : 0;
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_content_AssetManager_isUpToDate(JNIEnv* env, jobject clazz)
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_TRUE;
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return am->isUpToDate() ? JNI_TRUE : JNI_FALSE;
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_content_AssetManager_setLocale(JNIEnv* env, jobject clazz,
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                jstring locale)
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
45969a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    ScopedUtfChars locale8(env, locale);
46069a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    if (locale8.c_str() == NULL) {
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
46969a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    am->setLocale(locale8.c_str());
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jobjectArray android_content_AssetManager_getLocales(JNIEnv* env, jobject clazz)
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Vector<String8> locales;
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    am->getLocales(&locales);
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const int N = locales.size();
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jobjectArray result = env->NewObjectArray(N, g_stringClass, NULL);
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (result == NULL) {
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (int i=0; i<N; i++) {
4910db187a3e62074af6a22802bded52a921f69e7dfGilles Debunne        jstring str = env->NewStringUTF(locales[i].string());
4924d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne        if (str == NULL) {
4934d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne            return NULL;
4944d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne        }
4954d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne        env->SetObjectArrayElement(result, i, str);
4964d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne        env->DeleteLocalRef(str);
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return result;
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_content_AssetManager_setConfiguration(JNIEnv* env, jobject clazz,
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                          jint mcc, jint mnc,
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                          jstring locale, jint orientation,
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                          jint touchscreen, jint density,
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                          jint keyboard, jint keyboardHidden,
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                          jint navigation,
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                          jint screenWidth, jint screenHeight,
50969cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn                                                          jint smallestScreenWidthDp,
5103fc982f41fda1f254bfbc35490d81cd82a0ed90aDianne Hackborn                                                          jint screenWidthDp, jint screenHeightDp,
51127b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel                                                          jint screenLayout, jint uiMode,
51227b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel                                                          jint sdkVersion)
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ResTable_config config;
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    memset(&config, 0, sizeof(config));
52169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char* locale8 = locale != NULL ? env->GetStringUTFChars(locale, NULL) : NULL;
52369a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    config.mcc = (uint16_t)mcc;
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    config.mnc = (uint16_t)mnc;
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    config.orientation = (uint8_t)orientation;
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    config.touchscreen = (uint8_t)touchscreen;
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    config.density = (uint16_t)density;
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    config.keyboard = (uint8_t)keyboard;
530c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    config.inputFlags = (uint8_t)keyboardHidden;
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    config.navigation = (uint8_t)navigation;
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    config.screenWidth = (uint16_t)screenWidth;
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    config.screenHeight = (uint16_t)screenHeight;
53469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    config.smallestScreenWidthDp = (uint16_t)smallestScreenWidthDp;
5353fc982f41fda1f254bfbc35490d81cd82a0ed90aDianne Hackborn    config.screenWidthDp = (uint16_t)screenWidthDp;
5363fc982f41fda1f254bfbc35490d81cd82a0ed90aDianne Hackborn    config.screenHeightDp = (uint16_t)screenHeightDp;
537723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn    config.screenLayout = (uint8_t)screenLayout;
53827b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    config.uiMode = (uint8_t)uiMode;
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    config.sdkVersion = (uint16_t)sdkVersion;
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    config.minorVersion = 0;
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    am->setConfiguration(config, locale8);
54269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (locale != NULL) env->ReleaseStringUTFChars(locale, locale8);
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_content_AssetManager_getResourceIdentifier(JNIEnv* env, jobject clazz,
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                            jstring name,
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                            jstring defType,
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                            jstring defPackage)
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
55169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    ScopedStringChars name16(env, name);
55269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    if (name16.get() == NULL) {
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char16_t* defType16 = defType
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ? env->GetStringChars(defType, NULL) : NULL;
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jsize defTypeLen = defType
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ? env->GetStringLength(defType) : 0;
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char16_t* defPackage16 = defPackage
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ? env->GetStringChars(defPackage, NULL) : NULL;
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jsize defPackageLen = defPackage
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ? env->GetStringLength(defPackage) : 0;
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jint ident = am->getResources().identifierForName(
57169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        name16.get(), name16.size(), defType16, defTypeLen, defPackage16, defPackageLen);
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (defPackage16) {
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        env->ReleaseStringChars(defPackage, defPackage16);
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (defType16) {
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        env->ReleaseStringChars(defType, defType16);
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return ident;
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jstring android_content_AssetManager_getResourceName(JNIEnv* env, jobject clazz,
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                            jint resid)
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
59069a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ResTable::resource_name name;
592d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn    if (!am->getResources().getResourceName(resid, true, &name)) {
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
59569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    String16 str;
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (name.package != NULL) {
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        str.setTo(name.package, name.packageLen);
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
600d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn    if (name.type8 != NULL || name.type != NULL) {
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str.size() > 0) {
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            char16_t div = ':';
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            str.append(&div, 1);
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
605d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn        if (name.type8 != NULL) {
606d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn            str.append(String16(name.type8, name.typeLen));
607d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn        } else {
608d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn            str.append(name.type, name.typeLen);
609d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn        }
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
611d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn    if (name.name8 != NULL || name.name != NULL) {
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str.size() > 0) {
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            char16_t div = '/';
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            str.append(&div, 1);
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
616d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn        if (name.name8 != NULL) {
617d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn            str.append(String16(name.name8, name.nameLen));
618d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn        } else {
619d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn            str.append(name.name, name.nameLen);
620d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn        }
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
62269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return env->NewString((const jchar*)str.string(), str.size());
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jstring android_content_AssetManager_getResourcePackageName(JNIEnv* env, jobject clazz,
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                                   jint resid)
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
63369a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ResTable::resource_name name;
635d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn    if (!am->getResources().getResourceName(resid, true, &name)) {
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
63869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (name.package != NULL) {
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return env->NewString((const jchar*)name.package, name.packageLen);
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
64269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return NULL;
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jstring android_content_AssetManager_getResourceTypeName(JNIEnv* env, jobject clazz,
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                                jint resid)
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
65369a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ResTable::resource_name name;
655d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn    if (!am->getResources().getResourceName(resid, true, &name)) {
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
65869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
659d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn    if (name.type8 != NULL) {
660d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn        return env->NewStringUTF(name.type8);
661d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn    }
662d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (name.type != NULL) {
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return env->NewString((const jchar*)name.type, name.typeLen);
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
66669a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return NULL;
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jstring android_content_AssetManager_getResourceEntryName(JNIEnv* env, jobject clazz,
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                                 jint resid)
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
67769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ResTable::resource_name name;
679d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn    if (!am->getResources().getResourceName(resid, true, &name)) {
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
68269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
683d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn    if (name.name8 != NULL) {
684d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn        return env->NewStringUTF(name.name8);
685d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn    }
686d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (name.name != NULL) {
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return env->NewString((const jchar*)name.name, name.nameLen);
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
69069a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return NULL;
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_content_AssetManager_loadResourceValue(JNIEnv* env, jobject clazz,
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                           jint ident,
69655fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root                                                           jshort density,
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                           jobject outValue,
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                           jboolean resolve)
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
7001f7d30770abf0c243e7f577df785ad256b8bfcb0Dianne Hackborn    if (outValue == NULL) {
701e5b50a65ad26a32f6e58588ffdcbc0389eac9257Dianne Hackborn         jniThrowNullPointerException(env, "outValue");
702d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn         return 0;
703e5b50a65ad26a32f6e58588ffdcbc0389eac9257Dianne Hackborn    }
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable& res(am->getResources());
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Res_value value;
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ResTable_config config;
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t typeSpecFlags;
71355fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root    ssize_t block = res.getResource(ident, &value, false, density, &typeSpecFlags, &config);
71420cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#if THROW_ON_BAD_ID
71520cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn    if (block == BAD_INDEX) {
71620cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn        jniThrowException(env, "java/lang/IllegalStateException", "Bad resource!");
71720cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn        return 0;
71820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn    }
71920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#endif
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t ref = ident;
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (resolve) {
722fb5c3dba4ddac023cfd4cdcabdfdbcf343197c94Dianne Hackborn        block = res.resolveReference(&value, block, &ref, &typeSpecFlags, &config);
72320cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#if THROW_ON_BAD_ID
72420cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn        if (block == BAD_INDEX) {
72520cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn            jniThrowException(env, "java/lang/IllegalStateException", "Bad resource!");
72620cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn            return 0;
72720cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn        }
72820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#endif
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
730896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    if (block >= 0) {
731896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat        return copyValue(env, outValue, &res, value, ref, block, typeSpecFlags, &config);
732896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    }
733896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat
734896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    return static_cast<jint>(block);
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_content_AssetManager_loadResourceBagValue(JNIEnv* env, jobject clazz,
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                           jint ident, jint bagEntryId,
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                           jobject outValue, jboolean resolve)
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable& res(am->getResources());
74669a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Now lock down the resource object and start pulling stuff from it.
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    res.lock();
74969a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ssize_t block = -1;
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Res_value value;
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable::bag_entry* entry = NULL;
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t typeSpecFlags;
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ssize_t entryCount = res.getBagLocked(ident, &entry, &typeSpecFlags);
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (ssize_t i=0; i<entryCount; i++) {
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (((uint32_t)bagEntryId) == entry->map.name.ident) {
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            block = entry->stringBlock;
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            value = entry->map.value;
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        entry++;
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    res.unlock();
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (block < 0) {
768896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat        return static_cast<jint>(block);
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
77069a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t ref = ident;
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (resolve) {
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        block = res.resolveReference(&value, block, &ref, &typeSpecFlags);
77420cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#if THROW_ON_BAD_ID
77520cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn        if (block == BAD_INDEX) {
77620cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn            jniThrowException(env, "java/lang/IllegalStateException", "Bad resource!");
77720cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn            return 0;
77820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn        }
77920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#endif
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
781896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    if (block >= 0) {
782896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat        return copyValue(env, outValue, &res, value, ref, block, typeSpecFlags);
783896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    }
784896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat
785896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    return static_cast<jint>(block);
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_content_AssetManager_getStringBlockCount(JNIEnv* env, jobject clazz)
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return am->getResources().getTableCount();
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
797896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhatstatic jlong android_content_AssetManager_getNativeStringBlock(JNIEnv* env, jobject clazz,
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                           jint block)
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
804896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    return reinterpret_cast<jlong>(am->getResources().getTableStringBlock(block));
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jstring android_content_AssetManager_getCookieName(JNIEnv* env, jobject clazz,
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                       jint cookie)
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
814745d4efc8369d255341d810790132660e33d3b61Narayan Kamath    String8 name(am->getAssetPath(static_cast<int32_t>(cookie)));
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (name.length() == 0) {
8164d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne        jniThrowException(env, "java/lang/IndexOutOfBoundsException", "Empty cookie name");
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jstring str = env->NewStringUTF(name.string());
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return str;
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
823896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhatstatic jlong android_content_AssetManager_newTheme(JNIEnv* env, jobject clazz)
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
829896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    return reinterpret_cast<jlong>(new ResTable::Theme(am->getResources()));
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_content_AssetManager_deleteTheme(JNIEnv* env, jobject clazz,
833896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat                                                     jlong themeHandle)
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
835896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    ResTable::Theme* theme = reinterpret_cast<ResTable::Theme*>(themeHandle);
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    delete theme;
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_content_AssetManager_applyThemeStyle(JNIEnv* env, jobject clazz,
840896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat                                                         jlong themeHandle,
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                         jint styleRes,
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                         jboolean force)
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
844896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    ResTable::Theme* theme = reinterpret_cast<ResTable::Theme*>(themeHandle);
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    theme->applyStyle(styleRes, force ? true : false);
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_content_AssetManager_copyTheme(JNIEnv* env, jobject clazz,
849896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat                                                   jlong destHandle, jlong srcHandle)
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
851896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    ResTable::Theme* dest = reinterpret_cast<ResTable::Theme*>(destHandle);
852896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    ResTable::Theme* src = reinterpret_cast<ResTable::Theme*>(srcHandle);
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    dest->setTo(*src);
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_content_AssetManager_loadThemeAttributeValue(
857896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    JNIEnv* env, jobject clazz, jlong themeHandle, jint ident, jobject outValue, jboolean resolve)
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
859896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    ResTable::Theme* theme = reinterpret_cast<ResTable::Theme*>(themeHandle);
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable& res(theme->getResTable());
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Res_value value;
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // XXX value could be different in different configs!
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t typeSpecFlags = 0;
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ssize_t block = theme->getAttribute(ident, &value, &typeSpecFlags);
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t ref = 0;
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (resolve) {
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        block = res.resolveReference(&value, block, &ref, &typeSpecFlags);
86920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#if THROW_ON_BAD_ID
87020cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn        if (block == BAD_INDEX) {
87120cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn            jniThrowException(env, "java/lang/IllegalStateException", "Bad resource!");
87220cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn            return 0;
87320cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn        }
87420cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#endif
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return block >= 0 ? copyValue(env, outValue, &res, value, ref, block, typeSpecFlags) : block;
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_content_AssetManager_dumpTheme(JNIEnv* env, jobject clazz,
880896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat                                                   jlong themeHandle, jint pri,
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                   jstring tag, jstring prefix)
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
883896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    ResTable::Theme* theme = reinterpret_cast<ResTable::Theme*>(themeHandle);
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable& res(theme->getResTable());
88569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // XXX Need to use params.
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    theme->dumpToLog();
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_content_AssetManager_applyStyle(JNIEnv* env, jobject clazz,
891896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat                                                        jlong themeToken,
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        jint defStyleAttr,
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        jint defStyleRes,
894896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat                                                        jlong xmlParserToken,
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        jintArray attrs,
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        jintArray outValues,
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        jintArray outIndices)
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
8994d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne    if (themeToken == 0) {
90069a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        jniThrowNullPointerException(env, "theme token");
9014d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne        return JNI_FALSE;
9024d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne    }
9034d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne    if (attrs == NULL) {
90469a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        jniThrowNullPointerException(env, "attrs");
9054d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne        return JNI_FALSE;
9064d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne    }
9074d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne    if (outValues == NULL) {
90869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        jniThrowNullPointerException(env, "out values");
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
912b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn    DEBUG_STYLES(LOGI("APPLY STYLE: theme=0x%x defStyleAttr=0x%x defStyleRes=0x%x xml=0x%x",
913b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn        themeToken, defStyleAttr, defStyleRes, xmlParserToken));
91469a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
915896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    ResTable::Theme* theme = reinterpret_cast<ResTable::Theme*>(themeToken);
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable& res = theme->getResTable();
917896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    ResXMLParser* xmlParser = reinterpret_cast<ResXMLParser*>(xmlParserToken);
9180d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn    ResTable_config config;
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Res_value value;
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const jsize NI = env->GetArrayLength(attrs);
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const jsize NV = env->GetArrayLength(outValues);
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (NV < (NI*STYLE_NUM_ENTRIES)) {
9244d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne        jniThrowException(env, "java/lang/IndexOutOfBoundsException", "out values too small");
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jint* src = (jint*)env->GetPrimitiveArrayCritical(attrs, 0);
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (src == NULL) {
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jint* baseDest = (jint*)env->GetPrimitiveArrayCritical(outValues, 0);
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jint* dest = baseDest;
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (dest == NULL) {
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        env->ReleasePrimitiveArrayCritical(attrs, src, 0);
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jint* indices = NULL;
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int indicesIdx = 0;
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (outIndices != NULL) {
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (env->GetArrayLength(outIndices) > NI) {
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            indices = (jint*)env->GetPrimitiveArrayCritical(outIndices, 0);
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Load default style from attribute, if specified...
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t defStyleBagTypeSetFlags = 0;
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (defStyleAttr != 0) {
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Res_value value;
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (theme->getAttribute(defStyleAttr, &value, &defStyleBagTypeSetFlags) >= 0) {
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (value.dataType == Res_value::TYPE_REFERENCE) {
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                defStyleRes = value.data;
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Retrieve the style class associated with the current XML tag.
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int style = 0;
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t styleBagTypeSetFlags = 0;
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (xmlParser != NULL) {
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ssize_t idx = xmlParser->indexOfStyle();
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (idx >= 0 && xmlParser->getAttributeValue(idx, &value) >= 0) {
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (value.dataType == value.TYPE_ATTRIBUTE) {
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (theme->getAttribute(value.data, &value, &styleBagTypeSetFlags) < 0) {
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    value.dataType = Res_value::TYPE_NULL;
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (value.dataType == value.TYPE_REFERENCE) {
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                style = value.data;
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Now lock down the resource object and start pulling stuff from it.
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    res.lock();
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Retrieve the default style bag, if requested.
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable::bag_entry* defStyleEnt = NULL;
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t defStyleTypeSetFlags = 0;
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ssize_t bagOff = defStyleRes != 0
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ? res.getBagLocked(defStyleRes, &defStyleEnt, &defStyleTypeSetFlags) : -1;
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    defStyleTypeSetFlags |= defStyleBagTypeSetFlags;
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable::bag_entry* endDefStyleEnt = defStyleEnt +
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (bagOff >= 0 ? bagOff : 0);
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Retrieve the style class bag, if requested.
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable::bag_entry* styleEnt = NULL;
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t styleTypeSetFlags = 0;
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bagOff = style != 0 ? res.getBagLocked(style, &styleEnt, &styleTypeSetFlags) : -1;
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    styleTypeSetFlags |= styleBagTypeSetFlags;
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable::bag_entry* endStyleEnt = styleEnt +
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (bagOff >= 0 ? bagOff : 0);
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Retrieve the XML attributes, if requested.
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const jsize NX = xmlParser ? xmlParser->getAttributeCount() : 0;
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jsize ix=0;
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t curXmlAttr = xmlParser ? xmlParser->getAttributeNameResID(ix) : 0;
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static const ssize_t kXmlBlock = 0x10000000;
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Now iterate through all of the attributes that the client has requested,
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // filling in each with whatever data we can find.
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ssize_t block = 0;
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t typeSetFlags;
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (jsize ii=0; ii<NI; ii++) {
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const uint32_t curIdent = (uint32_t)src[ii];
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1010b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn        DEBUG_STYLES(LOGI("RETRIEVING ATTR 0x%08x...", curIdent));
101169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Try to find a value for this attribute...  we prioritize values
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // coming from, first XML attributes, then XML style, then default
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // style, and finally the theme.
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        value.dataType = Res_value::TYPE_NULL;
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        value.data = 0;
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        typeSetFlags = 0;
10180d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn        config.density = 0;
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Skip through XML attributes until the end or the next possible match.
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (ix < NX && curIdent > curXmlAttr) {
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ix++;
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            curXmlAttr = xmlParser->getAttributeNameResID(ix);
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Retrieve the current XML attribute if it matches, and step to next.
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ix < NX && curIdent == curXmlAttr) {
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            block = kXmlBlock;
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            xmlParser->getAttributeValue(ix, &value);
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ix++;
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            curXmlAttr = xmlParser->getAttributeNameResID(ix);
1031b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn            DEBUG_STYLES(LOGI("-> From XML: type=0x%x, data=0x%08x",
1032b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn                    value.dataType, value.data));
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Skip through the style values until the end or the next possible match.
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (styleEnt < endStyleEnt && curIdent > styleEnt->map.name.ident) {
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            styleEnt++;
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Retrieve the current style attribute if it matches, and step to next.
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (styleEnt < endStyleEnt && curIdent == styleEnt->map.name.ident) {
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (value.dataType == Res_value::TYPE_NULL) {
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                block = styleEnt->stringBlock;
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                typeSetFlags = styleTypeSetFlags;
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                value = styleEnt->map.value;
1045b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn                DEBUG_STYLES(LOGI("-> From style: type=0x%x, data=0x%08x",
1046b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn                        value.dataType, value.data));
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            styleEnt++;
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Skip through the default style values until the end or the next possible match.
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (defStyleEnt < endDefStyleEnt && curIdent > defStyleEnt->map.name.ident) {
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            defStyleEnt++;
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Retrieve the current default style attribute if it matches, and step to next.
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (defStyleEnt < endDefStyleEnt && curIdent == defStyleEnt->map.name.ident) {
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (value.dataType == Res_value::TYPE_NULL) {
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                block = defStyleEnt->stringBlock;
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                typeSetFlags = defStyleTypeSetFlags;
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                value = defStyleEnt->map.value;
1061b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn                DEBUG_STYLES(LOGI("-> From def style: type=0x%x, data=0x%08x",
1062b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn                        value.dataType, value.data));
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            defStyleEnt++;
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        uint32_t resid = 0;
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value.dataType != Res_value::TYPE_NULL) {
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Take care of resolving the found resource to its final value.
10700d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn            ssize_t newBlock = theme->resolveAttributeReference(&value, block,
10710d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn                    &resid, &typeSetFlags, &config);
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (newBlock >= 0) block = newBlock;
1073b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn            DEBUG_STYLES(LOGI("-> Resolved attr: type=0x%x, data=0x%08x",
1074b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn                    value.dataType, value.data));
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // If we still don't have a value for this attribute, try to find
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // it in the theme!
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ssize_t newBlock = theme->getAttribute(curIdent, &value, &typeSetFlags);
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (newBlock >= 0) {
1080b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn                DEBUG_STYLES(LOGI("-> From theme: type=0x%x, data=0x%08x",
1081b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn                        value.dataType, value.data));
10820d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn                newBlock = res.resolveReference(&value, block, &resid,
10830d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn                        &typeSetFlags, &config);
108420cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#if THROW_ON_BAD_ID
108520cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                if (newBlock == BAD_INDEX) {
108620cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                    jniThrowException(env, "java/lang/IllegalStateException", "Bad resource!");
108720cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                    return JNI_FALSE;
108820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                }
108920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#endif
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (newBlock >= 0) block = newBlock;
1091b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn                DEBUG_STYLES(LOGI("-> Resolved theme: type=0x%x, data=0x%08x",
1092b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn                        value.dataType, value.data));
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Deal with the special @null value -- it turns back to TYPE_NULL.
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value.dataType == Res_value::TYPE_REFERENCE && value.data == 0) {
1098b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn            DEBUG_STYLES(LOGI("-> Setting to @null!"));
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            value.dataType = Res_value::TYPE_NULL;
11007fbe4d2e7445ad4db07a42c74fe2934af46d1c7fKenny Root            block = kXmlBlock;
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1103b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn        DEBUG_STYLES(LOGI("Attribute 0x%08x: type=0x%x, data=0x%08x",
1104b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn                curIdent, value.dataType, value.data));
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Write the final value back to Java.
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest[STYLE_TYPE] = value.dataType;
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest[STYLE_DATA] = value.data;
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest[STYLE_ASSET_COOKIE] =
1110896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat            block != kXmlBlock ? reinterpret_cast<jint>(res.getTableCookie(block)) : (jint)-1;
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest[STYLE_RESOURCE_ID] = resid;
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest[STYLE_CHANGING_CONFIGURATIONS] = typeSetFlags;
11130d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn        dest[STYLE_DENSITY] = config.density;
111469a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (indices != NULL && value.dataType != Res_value::TYPE_NULL) {
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            indicesIdx++;
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            indices[indicesIdx] = ii;
11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
111969a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest += STYLE_NUM_ENTRIES;
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    res.unlock();
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (indices != NULL) {
11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        indices[0] = indicesIdx;
11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        env->ReleasePrimitiveArrayCritical(outIndices, indices, 0);
11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->ReleasePrimitiveArrayCritical(outValues, baseDest, 0);
11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->ReleasePrimitiveArrayCritical(attrs, src, 0);
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return JNI_TRUE;
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_content_AssetManager_retrieveAttributes(JNIEnv* env, jobject clazz,
1136896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat                                                        jlong xmlParserToken,
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        jintArray attrs,
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        jintArray outValues,
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        jintArray outIndices)
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
11414d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne    if (xmlParserToken == 0) {
114269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        jniThrowNullPointerException(env, "xmlParserToken");
11434d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne        return JNI_FALSE;
11444d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne    }
11454d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne    if (attrs == NULL) {
114669a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        jniThrowNullPointerException(env, "attrs");
11474d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne        return JNI_FALSE;
11484d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne    }
11494d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne    if (outValues == NULL) {
115069a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        jniThrowNullPointerException(env, "out values");
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
115369a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable& res(am->getResources());
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ResXMLParser* xmlParser = (ResXMLParser*)xmlParserToken;
11600d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn    ResTable_config config;
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Res_value value;
116269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const jsize NI = env->GetArrayLength(attrs);
11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const jsize NV = env->GetArrayLength(outValues);
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (NV < (NI*STYLE_NUM_ENTRIES)) {
11664d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne        jniThrowException(env, "java/lang/IndexOutOfBoundsException", "out values too small");
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
116969a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jint* src = (jint*)env->GetPrimitiveArrayCritical(attrs, 0);
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (src == NULL) {
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
117469a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jint* baseDest = (jint*)env->GetPrimitiveArrayCritical(outValues, 0);
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jint* dest = baseDest;
11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (dest == NULL) {
11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        env->ReleasePrimitiveArrayCritical(attrs, src, 0);
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
118169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jint* indices = NULL;
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int indicesIdx = 0;
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (outIndices != NULL) {
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (env->GetArrayLength(outIndices) > NI) {
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            indices = (jint*)env->GetPrimitiveArrayCritical(outIndices, 0);
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Now lock down the resource object and start pulling stuff from it.
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    res.lock();
119269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Retrieve the XML attributes, if requested.
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const jsize NX = xmlParser->getAttributeCount();
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jsize ix=0;
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t curXmlAttr = xmlParser->getAttributeNameResID(ix);
119769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static const ssize_t kXmlBlock = 0x10000000;
119969a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Now iterate through all of the attributes that the client has requested,
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // filling in each with whatever data we can find.
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ssize_t block = 0;
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t typeSetFlags;
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (jsize ii=0; ii<NI; ii++) {
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const uint32_t curIdent = (uint32_t)src[ii];
120669a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Try to find a value for this attribute...
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        value.dataType = Res_value::TYPE_NULL;
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        value.data = 0;
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        typeSetFlags = 0;
12110d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn        config.density = 0;
121269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Skip through XML attributes until the end or the next possible match.
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (ix < NX && curIdent > curXmlAttr) {
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ix++;
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            curXmlAttr = xmlParser->getAttributeNameResID(ix);
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Retrieve the current XML attribute if it matches, and step to next.
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ix < NX && curIdent == curXmlAttr) {
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            block = kXmlBlock;
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            xmlParser->getAttributeValue(ix, &value);
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ix++;
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            curXmlAttr = xmlParser->getAttributeNameResID(ix);
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
122569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //printf("Attribute 0x%08x: type=0x%x, data=0x%08x\n", curIdent, value.dataType, value.data);
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        uint32_t resid = 0;
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value.dataType != Res_value::TYPE_NULL) {
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Take care of resolving the found resource to its final value.
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //printf("Resolving attribute reference\n");
12310d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn            ssize_t newBlock = res.resolveReference(&value, block, &resid,
12320d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn                    &typeSetFlags, &config);
123320cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#if THROW_ON_BAD_ID
123420cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn            if (newBlock == BAD_INDEX) {
123520cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                jniThrowException(env, "java/lang/IllegalStateException", "Bad resource!");
123620cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                return JNI_FALSE;
123720cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn            }
123820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#endif
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (newBlock >= 0) block = newBlock;
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
124169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Deal with the special @null value -- it turns back to TYPE_NULL.
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value.dataType == Res_value::TYPE_REFERENCE && value.data == 0) {
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            value.dataType = Res_value::TYPE_NULL;
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
124669a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //printf("Attribute 0x%08x: final type=0x%x, data=0x%08x\n", curIdent, value.dataType, value.data);
124869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Write the final value back to Java.
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest[STYLE_TYPE] = value.dataType;
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest[STYLE_DATA] = value.data;
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest[STYLE_ASSET_COOKIE] =
1253896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat            block != kXmlBlock ? reinterpret_cast<jint>(res.getTableCookie(block)) : (jint)-1;
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest[STYLE_RESOURCE_ID] = resid;
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest[STYLE_CHANGING_CONFIGURATIONS] = typeSetFlags;
12560d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn        dest[STYLE_DENSITY] = config.density;
125769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (indices != NULL && value.dataType != Res_value::TYPE_NULL) {
12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            indicesIdx++;
12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            indices[indicesIdx] = ii;
12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
126269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest += STYLE_NUM_ENTRIES;
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
126569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    res.unlock();
126769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (indices != NULL) {
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        indices[0] = indicesIdx;
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        env->ReleasePrimitiveArrayCritical(outIndices, indices, 0);
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
127269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->ReleasePrimitiveArrayCritical(outValues, baseDest, 0);
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->ReleasePrimitiveArrayCritical(attrs, src, 0);
127569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return JNI_TRUE;
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_content_AssetManager_getArraySize(JNIEnv* env, jobject clazz,
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                       jint id)
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
1284d7c8672ccc8ccd1f99da60accc63d6817d41ac52Olivier Bailly        return 0;
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable& res(am->getResources());
128769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    res.lock();
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable::bag_entry* defStyleEnt = NULL;
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ssize_t bagOff = res.getBagLocked(id, &defStyleEnt);
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    res.unlock();
129269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
1293896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    return static_cast<jint>(bagOff);
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_content_AssetManager_retrieveArray(JNIEnv* env, jobject clazz,
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        jint id,
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        jintArray outValues)
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (outValues == NULL) {
130169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        jniThrowNullPointerException(env, "out values");
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
130469a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable& res(am->getResources());
13100d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn    ResTable_config config;
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Res_value value;
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ssize_t block;
131369a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const jsize NV = env->GetArrayLength(outValues);
131569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jint* baseDest = (jint*)env->GetPrimitiveArrayCritical(outValues, 0);
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jint* dest = baseDest;
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (dest == NULL) {
13194d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne        jniThrowException(env, "java/lang/OutOfMemoryError", "");
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
132269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Now lock down the resource object and start pulling stuff from it.
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    res.lock();
132569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable::bag_entry* arrayEnt = NULL;
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t arrayTypeSetFlags = 0;
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ssize_t bagOff = res.getBagLocked(id, &arrayEnt, &arrayTypeSetFlags);
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable::bag_entry* endArrayEnt = arrayEnt +
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (bagOff >= 0 ? bagOff : 0);
133169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int i = 0;
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t typeSetFlags;
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (i < NV && arrayEnt < endArrayEnt) {
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        block = arrayEnt->stringBlock;
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        typeSetFlags = arrayTypeSetFlags;
13370d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn        config.density = 0;
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        value = arrayEnt->map.value;
133969a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        uint32_t resid = 0;
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value.dataType != Res_value::TYPE_NULL) {
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Take care of resolving the found resource to its final value.
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //printf("Resolving attribute reference\n");
13440d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn            ssize_t newBlock = res.resolveReference(&value, block, &resid,
13450d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn                    &typeSetFlags, &config);
134620cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#if THROW_ON_BAD_ID
134720cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn            if (newBlock == BAD_INDEX) {
134820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                jniThrowException(env, "java/lang/IllegalStateException", "Bad resource!");
134920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                return JNI_FALSE;
135020cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn            }
135120cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#endif
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (newBlock >= 0) block = newBlock;
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Deal with the special @null value -- it turns back to TYPE_NULL.
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value.dataType == Res_value::TYPE_REFERENCE && value.data == 0) {
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            value.dataType = Res_value::TYPE_NULL;
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //printf("Attribute 0x%08x: final type=0x%x, data=0x%08x\n", curIdent, value.dataType, value.data);
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Write the final value back to Java.
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest[STYLE_TYPE] = value.dataType;
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest[STYLE_DATA] = value.data;
1365896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat        dest[STYLE_ASSET_COOKIE] = reinterpret_cast<jint>(res.getTableCookie(block));
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest[STYLE_RESOURCE_ID] = resid;
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest[STYLE_CHANGING_CONFIGURATIONS] = typeSetFlags;
13680d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn        dest[STYLE_DENSITY] = config.density;
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest += STYLE_NUM_ENTRIES;
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        i+= STYLE_NUM_ENTRIES;
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        arrayEnt++;
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
137369a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    i /= STYLE_NUM_ENTRIES;
137569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    res.unlock();
137769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->ReleasePrimitiveArrayCritical(outValues, baseDest, 0);
137969a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return i;
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1383896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhatstatic jlong android_content_AssetManager_openXmlAssetNative(JNIEnv* env, jobject clazz,
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                         jint cookie,
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                         jstring fileName)
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
139271f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("openXmlAsset in %p (Java object %p)\n", am, clazz);
13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
139469a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    ScopedUtfChars fileName8(env, fileName);
139569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    if (fileName8.c_str() == NULL) {
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Asset* a = cookie
1400745d4efc8369d255341d810790132660e33d3b61Narayan Kamath        ? am->openNonAsset(static_cast<int32_t>(cookie), fileName8.c_str(), Asset::ACCESS_BUFFER)
140169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        : am->openNonAsset(fileName8.c_str(), Asset::ACCESS_BUFFER);
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (a == NULL) {
140469a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        jniThrowException(env, "java/io/FileNotFoundException", fileName8.c_str());
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ResXMLTree* block = new ResXMLTree();
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t err = block->setTo(a->getBuffer(true), a->getLength(), true);
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    a->close();
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    delete a;
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (err != NO_ERROR) {
14144d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne        jniThrowException(env, "java/io/FileNotFoundException", "Corrupt XML binary file");
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1418896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    return reinterpret_cast<jlong>(block);
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jintArray android_content_AssetManager_getArrayStringInfo(JNIEnv* env, jobject clazz,
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                                 jint arrayResId)
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable& res(am->getResources());
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable::bag_entry* startOfBag;
14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ssize_t N = res.lockBag(arrayResId, &startOfBag);
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (N < 0) {
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jintArray array = env->NewIntArray(N * 2);
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (array == NULL) {
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        res.unlockBag(startOfBag);
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Res_value value;
14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable::bag_entry* bag = startOfBag;
14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (size_t i = 0, j = 0; ((ssize_t)i)<N; i++, bag++) {
14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jint stringIndex = -1;
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jint stringBlock = 0;
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        value = bag->map.value;
144869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Take care of resolving the found resource to its final value.
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        stringBlock = res.resolveReference(&value, bag->stringBlock, NULL);
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value.dataType == Res_value::TYPE_STRING) {
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stringIndex = value.data;
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
145469a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
145520cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#if THROW_ON_BAD_ID
145620cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn        if (stringBlock == BAD_INDEX) {
145720cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn            jniThrowException(env, "java/lang/IllegalStateException", "Bad resource!");
145820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn            return array;
145920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn        }
146020cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#endif
146169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //todo: It might be faster to allocate a C array to contain
14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //      the blocknums and indices, put them in there and then
14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //      do just one SetIntArrayRegion()
14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        env->SetIntArrayRegion(array, j, 1, &stringBlock);
14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        env->SetIntArrayRegion(array, j + 1, 1, &stringIndex);
14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        j = j + 2;
14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    res.unlockBag(startOfBag);
14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return array;
14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jobjectArray android_content_AssetManager_getArrayStringResource(JNIEnv* env, jobject clazz,
14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                                        jint arrayResId)
14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable& res(am->getResources());
14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable::bag_entry* startOfBag;
14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ssize_t N = res.lockBag(arrayResId, &startOfBag);
14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (N < 0) {
14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1488aa5fe3d206f72c4e7ff6632e169de2d0df6672e2Vladimir Marko    jobjectArray array = env->NewObjectArray(N, g_stringClass, NULL);
1489485dd21bbefde378c392da3de48887aee9fabebeKenny Root    if (env->ExceptionCheck()) {
14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        res.unlockBag(startOfBag);
14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Res_value value;
14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable::bag_entry* bag = startOfBag;
14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t strLen = 0;
14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (size_t i=0; ((ssize_t)i)<N; i++, bag++) {
14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        value = bag->map.value;
14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jstring str = NULL;
1500780d2a1b714724d85227141c76b3c64f543f00b4Kenny Root
15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Take care of resolving the found resource to its final value.
15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ssize_t block = res.resolveReference(&value, bag->stringBlock, NULL);
150320cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#if THROW_ON_BAD_ID
150420cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn        if (block == BAD_INDEX) {
150520cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn            jniThrowException(env, "java/lang/IllegalStateException", "Bad resource!");
150620cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn            return array;
150720cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn        }
150820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#endif
15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value.dataType == Res_value::TYPE_STRING) {
1510780d2a1b714724d85227141c76b3c64f543f00b4Kenny Root            const ResStringPool* pool = res.getTableStringBlock(block);
1511780d2a1b714724d85227141c76b3c64f543f00b4Kenny Root            const char* str8 = pool->string8At(value.data, &strLen);
1512780d2a1b714724d85227141c76b3c64f543f00b4Kenny Root            if (str8 != NULL) {
1513780d2a1b714724d85227141c76b3c64f543f00b4Kenny Root                str = env->NewStringUTF(str8);
1514780d2a1b714724d85227141c76b3c64f543f00b4Kenny Root            } else {
1515780d2a1b714724d85227141c76b3c64f543f00b4Kenny Root                const char16_t* str16 = pool->stringAt(value.data, &strLen);
1516780d2a1b714724d85227141c76b3c64f543f00b4Kenny Root                str = env->NewString(str16, strLen);
1517485dd21bbefde378c392da3de48887aee9fabebeKenny Root            }
1518485dd21bbefde378c392da3de48887aee9fabebeKenny Root
1519485dd21bbefde378c392da3de48887aee9fabebeKenny Root            // If one of our NewString{UTF} calls failed due to memory, an
1520485dd21bbefde378c392da3de48887aee9fabebeKenny Root            // exception will be pending.
1521485dd21bbefde378c392da3de48887aee9fabebeKenny Root            if (env->ExceptionCheck()) {
1522485dd21bbefde378c392da3de48887aee9fabebeKenny Root                res.unlockBag(startOfBag);
1523485dd21bbefde378c392da3de48887aee9fabebeKenny Root                return NULL;
15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1525780d2a1b714724d85227141c76b3c64f543f00b4Kenny Root
15264d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne            env->SetObjectArrayElement(array, i, str);
1527485dd21bbefde378c392da3de48887aee9fabebeKenny Root
15284d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne            // str is not NULL at that point, otherwise ExceptionCheck would have been true.
15294d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne            // If we have a large amount of strings in our array, we might
15304d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne            // overflow the local reference table of the VM.
1531485dd21bbefde378c392da3de48887aee9fabebeKenny Root            env->DeleteLocalRef(str);
1532485dd21bbefde378c392da3de48887aee9fabebeKenny Root        }
15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    res.unlockBag(startOfBag);
15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return array;
15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jintArray android_content_AssetManager_getArrayIntResource(JNIEnv* env, jobject clazz,
15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                                        jint arrayResId)
15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable& res(am->getResources());
15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable::bag_entry* startOfBag;
15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ssize_t N = res.lockBag(arrayResId, &startOfBag);
15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (N < 0) {
15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jintArray array = env->NewIntArray(N);
15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (array == NULL) {
15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        res.unlockBag(startOfBag);
15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Res_value value;
15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable::bag_entry* bag = startOfBag;
15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (size_t i=0; ((ssize_t)i)<N; i++, bag++) {
15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        value = bag->map.value;
156369a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Take care of resolving the found resource to its final value.
15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ssize_t block = res.resolveReference(&value, bag->stringBlock, NULL);
156620cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#if THROW_ON_BAD_ID
156720cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn        if (block == BAD_INDEX) {
156820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn            jniThrowException(env, "java/lang/IllegalStateException", "Bad resource!");
156920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn            return array;
157020cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn        }
157120cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#endif
15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value.dataType >= Res_value::TYPE_FIRST_INT
15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                && value.dataType <= Res_value::TYPE_LAST_INT) {
15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int intVal = value.data;
15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            env->SetIntArrayRegion(array, i, 1, &intVal);
15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    res.unlockBag(startOfBag);
15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return array;
15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_content_AssetManager_init(JNIEnv* env, jobject clazz)
15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = new AssetManager();
15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
15864d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne        jniThrowException(env, "java/lang/OutOfMemoryError", "");
15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    am->addDefaultAssets();
15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
159271f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("Created AssetManager %p for Java object %p\n", am, clazz);
1593896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    env->SetLongField(clazz, gAssetManagerOffsets.mObject, reinterpret_cast<jlong>(am));
15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_content_AssetManager_destroy(JNIEnv* env, jobject clazz)
15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = (AssetManager*)
1599896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat        (env->GetLongField(clazz, gAssetManagerOffsets.mObject));
160071f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("Destroying AssetManager %p for Java object %p\n", am, clazz);
16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am != NULL) {
16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        delete am;
1603896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat        env->SetLongField(clazz, gAssetManagerOffsets.mObject, 0);
16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_content_AssetManager_getGlobalAssetCount(JNIEnv* env, jobject clazz)
16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return Asset::getGlobalCount();
16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
161282e1ee93eece8fb0aec6acc3ef4ee7b1c86feec7Dianne Hackbornstatic jobject android_content_AssetManager_getAssetAllocations(JNIEnv* env, jobject clazz)
161382e1ee93eece8fb0aec6acc3ef4ee7b1c86feec7Dianne Hackborn{
161482e1ee93eece8fb0aec6acc3ef4ee7b1c86feec7Dianne Hackborn    String8 alloc = Asset::getAssetAllocations();
161582e1ee93eece8fb0aec6acc3ef4ee7b1c86feec7Dianne Hackborn    if (alloc.length() <= 0) {
161682e1ee93eece8fb0aec6acc3ef4ee7b1c86feec7Dianne Hackborn        return NULL;
161782e1ee93eece8fb0aec6acc3ef4ee7b1c86feec7Dianne Hackborn    }
161869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
161982e1ee93eece8fb0aec6acc3ef4ee7b1c86feec7Dianne Hackborn    jstring str = env->NewStringUTF(alloc.string());
162082e1ee93eece8fb0aec6acc3ef4ee7b1c86feec7Dianne Hackborn    return str;
162182e1ee93eece8fb0aec6acc3ef4ee7b1c86feec7Dianne Hackborn}
162282e1ee93eece8fb0aec6acc3ef4ee7b1c86feec7Dianne Hackborn
16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_content_AssetManager_getGlobalAssetManagerCount(JNIEnv* env, jobject clazz)
16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return AssetManager::getGlobalCount();
16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * JNI registration.
16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gAssetManagerMethods[] = {
16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* name, signature, funcPtr */
16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Basic asset stuff.
1637896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    { "openAsset",      "(Ljava/lang/String;I)J",
16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_openAsset },
16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "openAssetFd",      "(Ljava/lang/String;[J)Landroid/os/ParcelFileDescriptor;",
16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_openAssetFd },
1641896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    { "openNonAssetNative", "(ILjava/lang/String;I)J",
16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_openNonAssetNative },
16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "openNonAssetFdNative", "(ILjava/lang/String;[J)Landroid/os/ParcelFileDescriptor;",
16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_openNonAssetFdNative },
16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "list",           "(Ljava/lang/String;)[Ljava/lang/String;",
16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_list },
1647896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    { "destroyAsset",   "(J)V",
16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_destroyAsset },
1649896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    { "readAssetChar",  "(J)I",
16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_readAssetChar },
1651896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    { "readAsset",      "(J[BII)I",
16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_readAsset },
1653896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    { "seekAsset",      "(JJI)J",
16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_seekAsset },
1655896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    { "getAssetLength", "(J)J",
16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_getAssetLength },
1657896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    { "getAssetRemainingLength", "(J)J",
16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_getAssetRemainingLength },
1659f7be4800df28d7cb6a96003046bf90245e7054abDianne Hackborn    { "addAssetPathNative", "(Ljava/lang/String;)I",
16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_addAssetPath },
16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "isUpToDate",     "()Z",
16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_isUpToDate },
16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Resources.
16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "setLocale",      "(Ljava/lang/String;)V",
16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_setLocale },
16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "getLocales",      "()[Ljava/lang/String;",
16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_getLocales },
166969cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    { "setConfiguration", "(IILjava/lang/String;IIIIIIIIIIIIII)V",
16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_setConfiguration },
16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "getResourceIdentifier","(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I",
16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_getResourceIdentifier },
16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "getResourceName","(I)Ljava/lang/String;",
16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_getResourceName },
16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "getResourcePackageName","(I)Ljava/lang/String;",
16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_getResourcePackageName },
16779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "getResourceTypeName","(I)Ljava/lang/String;",
16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_getResourceTypeName },
16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "getResourceEntryName","(I)Ljava/lang/String;",
16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_getResourceEntryName },
168155fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root    { "loadResourceValue","(ISLandroid/util/TypedValue;Z)I",
16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_loadResourceValue },
16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "loadResourceBagValue","(IILandroid/util/TypedValue;Z)I",
16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_loadResourceBagValue },
16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "getStringBlockCount","()I",
16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_getStringBlockCount },
1687896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    { "getNativeStringBlock","(I)J",
16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_getNativeStringBlock },
16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "getCookieName","(I)Ljava/lang/String;",
16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_getCookieName },
16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Themes.
1693896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    { "newTheme", "()J",
16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_newTheme },
1695896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    { "deleteTheme", "(J)V",
16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_deleteTheme },
1697896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    { "applyThemeStyle", "(JIZ)V",
16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_applyThemeStyle },
1699896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    { "copyTheme", "(JJ)V",
17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_copyTheme },
1701896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    { "loadThemeAttributeValue", "(JILandroid/util/TypedValue;Z)I",
17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_loadThemeAttributeValue },
1703896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    { "dumpTheme", "(JILjava/lang/String;Ljava/lang/String;)V",
17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_dumpTheme },
1705896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    { "applyStyle","(JIIJ[I[I[I)Z",
17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_applyStyle },
1707896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    { "retrieveAttributes","(J[I[I[I)Z",
17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_retrieveAttributes },
17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "getArraySize","(I)I",
17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_getArraySize },
17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "retrieveArray","(I[I)I",
17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_retrieveArray },
17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // XML files.
1715896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat    { "openXmlAssetNative", "(ILjava/lang/String;)J",
17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_openXmlAssetNative },
17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Arrays.
17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "getArrayStringResource","(I)[Ljava/lang/String;",
17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_getArrayStringResource },
17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "getArrayStringInfo","(I)[I",
17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_getArrayStringInfo },
17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "getArrayIntResource","(I)[I",
17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_getArrayIntResource },
17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Bookkeeping.
17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "init",           "()V",
17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_init },
17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "destroy",        "()V",
17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_destroy },
17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "getGlobalAssetCount", "()I",
17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_getGlobalAssetCount },
173382e1ee93eece8fb0aec6acc3ef4ee7b1c86feec7Dianne Hackborn    { "getAssetAllocations", "()Ljava/lang/String;",
173482e1ee93eece8fb0aec6acc3ef4ee7b1c86feec7Dianne Hackborn        (void*) android_content_AssetManager_getAssetAllocations },
17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "getGlobalAssetManagerCount", "()I",
17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_getGlobalAssetCount },
17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_content_AssetManager(JNIEnv* env)
17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jclass typedValue = env->FindClass("android/util/TypedValue");
17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOG_FATAL_IF(typedValue == NULL, "Unable to find class android/util/TypedValue");
17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gTypedValueOffsets.mType
17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        = env->GetFieldID(typedValue, "type", "I");
17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOG_FATAL_IF(gTypedValueOffsets.mType == NULL, "Unable to find TypedValue.type");
17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gTypedValueOffsets.mData
17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        = env->GetFieldID(typedValue, "data", "I");
17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOG_FATAL_IF(gTypedValueOffsets.mData == NULL, "Unable to find TypedValue.data");
17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gTypedValueOffsets.mString
17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        = env->GetFieldID(typedValue, "string", "Ljava/lang/CharSequence;");
17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOG_FATAL_IF(gTypedValueOffsets.mString == NULL, "Unable to find TypedValue.string");
17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gTypedValueOffsets.mAssetCookie
17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        = env->GetFieldID(typedValue, "assetCookie", "I");
17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOG_FATAL_IF(gTypedValueOffsets.mAssetCookie == NULL, "Unable to find TypedValue.assetCookie");
17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gTypedValueOffsets.mResourceId
17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        = env->GetFieldID(typedValue, "resourceId", "I");
17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOG_FATAL_IF(gTypedValueOffsets.mResourceId == NULL, "Unable to find TypedValue.resourceId");
17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gTypedValueOffsets.mChangingConfigurations
17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        = env->GetFieldID(typedValue, "changingConfigurations", "I");
17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOG_FATAL_IF(gTypedValueOffsets.mChangingConfigurations == NULL, "Unable to find TypedValue.changingConfigurations");
17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gTypedValueOffsets.mDensity = env->GetFieldID(typedValue, "density", "I");
17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOG_FATAL_IF(gTypedValueOffsets.mDensity == NULL, "Unable to find TypedValue.density");
17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jclass assetFd = env->FindClass("android/content/res/AssetFileDescriptor");
17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOG_FATAL_IF(assetFd == NULL, "Unable to find class android/content/res/AssetFileDescriptor");
17669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gAssetFileDescriptorOffsets.mFd
17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        = env->GetFieldID(assetFd, "mFd", "Landroid/os/ParcelFileDescriptor;");
17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOG_FATAL_IF(gAssetFileDescriptorOffsets.mFd == NULL, "Unable to find AssetFileDescriptor.mFd");
17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gAssetFileDescriptorOffsets.mStartOffset
17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        = env->GetFieldID(assetFd, "mStartOffset", "J");
17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOG_FATAL_IF(gAssetFileDescriptorOffsets.mStartOffset == NULL, "Unable to find AssetFileDescriptor.mStartOffset");
17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gAssetFileDescriptorOffsets.mLength
17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        = env->GetFieldID(assetFd, "mLength", "J");
17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOG_FATAL_IF(gAssetFileDescriptorOffsets.mLength == NULL, "Unable to find AssetFileDescriptor.mLength");
17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jclass assetManager = env->FindClass("android/content/res/AssetManager");
17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOG_FATAL_IF(assetManager == NULL, "Unable to find class android/content/res/AssetManager");
17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gAssetManagerOffsets.mObject
1779896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat        = env->GetFieldID(assetManager, "mObject", "J");
17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOG_FATAL_IF(gAssetManagerOffsets.mObject == NULL, "Unable to find AssetManager.mObject");
17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1782c1318babb44dded89b88fb5df950b5cd6c6f83daCarl Shapiro    jclass stringClass = env->FindClass("java/lang/String");
1783c1318babb44dded89b88fb5df950b5cd6c6f83daCarl Shapiro    LOG_FATAL_IF(stringClass == NULL, "Unable to find class java/lang/String");
1784c1318babb44dded89b88fb5df950b5cd6c6f83daCarl Shapiro    g_stringClass = (jclass)env->NewGlobalRef(stringClass);
1785aa5fe3d206f72c4e7ff6632e169de2d0df6672e2Vladimir Marko    LOG_FATAL_IF(g_stringClass == NULL, "Unable to create global reference for class java/lang/String");
17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return AndroidRuntime::registerNativeMethods(env,
17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "android/content/res/AssetManager", gAssetManagerMethods, NELEM(gAssetManagerMethods));
17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android
1792