diff options
Diffstat (limited to 'core/jni')
-rw-r--r-- | core/jni/android_util_AssetManager.cpp | 50 | ||||
-rw-r--r-- | core/jni/android_util_XmlBlock.cpp | 7 |
2 files changed, 51 insertions, 6 deletions
diff --git a/core/jni/android_util_AssetManager.cpp b/core/jni/android_util_AssetManager.cpp index 9dde701..4147608 100644 --- a/core/jni/android_util_AssetManager.cpp +++ b/core/jni/android_util_AssetManager.cpp @@ -73,6 +73,13 @@ static struct assetmanager_offsets_t jfieldID mObject; } gAssetManagerOffsets; +static struct sparsearray_offsets_t +{ + jclass classObject; + jmethodID constructor; + jmethodID put; +} gSparseArrayOffsets; + jclass g_stringClass = NULL; // ---------------------------------------------------------------------------- @@ -905,6 +912,26 @@ static jstring android_content_AssetManager_getCookieName(JNIEnv* env, jobject c return str; } +static jobject android_content_AssetManager_getAssignedPackageIdentifiers(JNIEnv* env, jobject clazz) +{ + AssetManager* am = assetManagerForJavaObject(env, clazz); + if (am == NULL) { + return 0; + } + + const ResTable& res = am->getResources(); + + jobject sparseArray = env->NewObject(gSparseArrayOffsets.classObject, + gSparseArrayOffsets.constructor); + const size_t N = res.getBasePackageCount(); + for (size_t i = 0; i < N; i++) { + const String16 name = res.getBasePackageName(i); + env->CallVoidMethod(sparseArray, gSparseArrayOffsets.put, (jint) res.getBasePackageId(i), + env->NewString(name, name.size())); + } + return sparseArray; +} + static jlong android_content_AssetManager_newTheme(JNIEnv* env, jobject clazz) { AssetManager* am = assetManagerForJavaObject(env, clazz); @@ -1675,16 +1702,19 @@ static jlong android_content_AssetManager_openXmlAssetNative(JNIEnv* env, jobjec return 0; } - Asset* a = cookie - ? am->openNonAsset(static_cast<int32_t>(cookie), fileName8.c_str(), Asset::ACCESS_BUFFER) - : am->openNonAsset(fileName8.c_str(), Asset::ACCESS_BUFFER); + int32_t assetCookie = static_cast<int32_t>(cookie); + Asset* a = assetCookie + ? am->openNonAsset(assetCookie, fileName8.c_str(), Asset::ACCESS_BUFFER) + : am->openNonAsset(fileName8.c_str(), Asset::ACCESS_BUFFER, &assetCookie); if (a == NULL) { jniThrowException(env, "java/io/FileNotFoundException", fileName8.c_str()); return 0; } - ResXMLTree* block = new ResXMLTree(); + const DynamicRefTable* dynamicRefTable = + am->getResources().getDynamicRefTableForCookie(assetCookie); + ResXMLTree* block = new ResXMLTree(dynamicRefTable); status_t err = block->setTo(a->getBuffer(true), a->getLength(), true); a->close(); delete a; @@ -1972,6 +2002,8 @@ static JNINativeMethod gAssetManagerMethods[] = { (void*) android_content_AssetManager_getNativeStringBlock }, { "getCookieName","(I)Ljava/lang/String;", (void*) android_content_AssetManager_getCookieName }, + { "getAssignedPackageIdentifiers","()Landroid/util/SparseArray;", + (void*) android_content_AssetManager_getAssignedPackageIdentifiers }, // Themes. { "newTheme", "()J", @@ -2068,6 +2100,16 @@ int register_android_content_AssetManager(JNIEnv* env) g_stringClass = (jclass)env->NewGlobalRef(stringClass); LOG_FATAL_IF(g_stringClass == NULL, "Unable to create global reference for class java/lang/String"); + jclass sparseArrayClass = env->FindClass("android/util/SparseArray"); + LOG_FATAL_IF(sparseArrayClass == NULL, "Unable to find class android/util/SparseArray"); + gSparseArrayOffsets.classObject = (jclass) env->NewGlobalRef(sparseArrayClass); + gSparseArrayOffsets.constructor = + env->GetMethodID(gSparseArrayOffsets.classObject, "<init>", "()V"); + LOG_FATAL_IF(gSparseArrayOffsets.constructor == NULL, "Unable to find SparseArray.<init>()"); + gSparseArrayOffsets.put = + env->GetMethodID(gSparseArrayOffsets.classObject, "put", "(ILjava/lang/Object;)V"); + LOG_FATAL_IF(gSparseArrayOffsets.put == NULL, "Unable to find SparseArray.put(int, V)"); + return AndroidRuntime::registerNativeMethods(env, "android/content/res/AssetManager", gAssetManagerMethods, NELEM(gAssetManagerMethods)); } diff --git a/core/jni/android_util_XmlBlock.cpp b/core/jni/android_util_XmlBlock.cpp index 03de5c0..2cccb83 100644 --- a/core/jni/android_util_XmlBlock.cpp +++ b/core/jni/android_util_XmlBlock.cpp @@ -47,10 +47,11 @@ static jlong android_content_XmlBlock_nativeCreate(JNIEnv* env, jobject clazz, } jbyte* b = env->GetByteArrayElements(bArray, NULL); - ResXMLTree* osb = new ResXMLTree(b+off, len, true); + ResXMLTree* osb = new ResXMLTree(); + osb->setTo(b+off, len, true); env->ReleaseByteArrayElements(bArray, b, 0); - if (osb == NULL || osb->getError() != NO_ERROR) { + if (osb->getError() != NO_ERROR) { jniThrowException(env, "java/lang/IllegalArgumentException", NULL); return 0; } @@ -113,6 +114,8 @@ static jint android_content_XmlBlock_nativeNext(JNIEnv* env, jobject clazz, return 1; case ResXMLParser::BAD_DOCUMENT: goto bad; + default: + break; } } while (true); |