summaryrefslogtreecommitdiffstats
path: root/core/jni/android_util_AssetManager.cpp
diff options
context:
space:
mode:
authorJosh Guilfoyle <Josh.Guilfoyle@T-Mobile.com>2010-12-23 14:30:28 -0800
committerJosh Guilfoyle <Josh.Guilfoyle@T-Mobile.com>2010-12-23 22:33:16 -0800
commitce9c0447f946d8fe20d020f01b6548c815579848 (patch)
tree27f4eac06f8960e31f9dfb670f4e67f11029e486 /core/jni/android_util_AssetManager.cpp
parent0e7ab2f533037698b4ab4255828fa2e08f90566f (diff)
parent6bcc7a7e5fc5a2340c4f060141bec9d181454807 (diff)
downloadframeworks_base-ce9c0447f946d8fe20d020f01b6548c815579848.zip
frameworks_base-ce9c0447f946d8fe20d020f01b6548c815579848.tar.gz
frameworks_base-ce9c0447f946d8fe20d020f01b6548c815579848.tar.bz2
Merge commit 'android-2.3.1_r1' into themes-exp-2.3.1_r1
Conflicts: core/java/android/app/ActivityThread.java core/java/android/content/pm/ApplicationInfo.java core/java/android/content/pm/PackageParser.java core/res/AndroidManifest.xml services/java/com/android/server/PackageManagerService.java services/java/com/android/server/SystemServer.java test-runner/src/android/test/mock/MockPackageManager.java
Diffstat (limited to 'core/jni/android_util_AssetManager.cpp')
-rw-r--r--core/jni/android_util_AssetManager.cpp177
1 files changed, 92 insertions, 85 deletions
diff --git a/core/jni/android_util_AssetManager.cpp b/core/jni/android_util_AssetManager.cpp
index 0cabc9a..1c0537d 100644
--- a/core/jni/android_util_AssetManager.cpp
+++ b/core/jni/android_util_AssetManager.cpp
@@ -70,16 +70,6 @@ jclass g_stringClass = NULL;
// ----------------------------------------------------------------------------
-static void doThrow(JNIEnv* env, const char* exc, const char* msg = NULL)
-{
- jclass npeClazz;
-
- npeClazz = env->FindClass(exc);
- LOG_FATAL_IF(npeClazz == NULL, "Unable to find class %s", exc);
-
- env->ThrowNew(npeClazz, msg);
-}
-
enum {
STYLE_NUM_ENTRIES = 6,
STYLE_TYPE = 0,
@@ -135,14 +125,14 @@ static jint android_content_AssetManager_openAsset(JNIEnv* env, jobject clazz,
LOGV("openAsset in %p (Java object %p)\n", am, clazz);
- if (fileName == NULL || am == NULL) {
- doThrow(env, "java/lang/NullPointerException");
+ if (fileName == NULL) {
+ jniThrowException(env, "java/lang/NullPointerException", "fileName");
return -1;
}
if (mode != Asset::ACCESS_UNKNOWN && mode != Asset::ACCESS_RANDOM
&& mode != Asset::ACCESS_STREAMING && mode != Asset::ACCESS_BUFFER) {
- doThrow(env, "java/lang/IllegalArgumentException");
+ jniThrowException(env, "java/lang/IllegalArgumentException", "Bad access mode");
return -1;
}
@@ -150,7 +140,7 @@ static jint android_content_AssetManager_openAsset(JNIEnv* env, jobject clazz,
Asset* a = am->open(fileName8, (Asset::AccessMode)mode);
if (a == NULL) {
- doThrow(env, "java/io/FileNotFoundException", fileName8);
+ jniThrowException(env, "java/io/FileNotFoundException", fileName8);
env->ReleaseStringUTFChars(fileName, fileName8);
return -1;
}
@@ -168,7 +158,7 @@ static jobject returnParcelFileDescriptor(JNIEnv* env, Asset* a, jlongArray outO
delete a;
if (fd < 0) {
- doThrow(env, "java/io/FileNotFoundException",
+ jniThrowException(env, "java/io/FileNotFoundException",
"This file can not be opened as a file descriptor; it is probably compressed");
return NULL;
}
@@ -203,8 +193,8 @@ static jobject android_content_AssetManager_openAssetFd(JNIEnv* env, jobject cla
LOGV("openAssetFd in %p (Java object %p)\n", am, clazz);
- if (fileName == NULL || am == NULL) {
- doThrow(env, "java/lang/NullPointerException");
+ if (fileName == NULL) {
+ jniThrowException(env, "java/lang/NullPointerException", "fileName");
return NULL;
}
@@ -212,7 +202,7 @@ static jobject android_content_AssetManager_openAssetFd(JNIEnv* env, jobject cla
Asset* a = am->open(fileName8, Asset::ACCESS_RANDOM);
if (a == NULL) {
- doThrow(env, "java/io/FileNotFoundException", fileName8);
+ jniThrowException(env, "java/io/FileNotFoundException", fileName8);
env->ReleaseStringUTFChars(fileName, fileName8);
return NULL;
}
@@ -235,14 +225,14 @@ static jint android_content_AssetManager_openNonAssetNative(JNIEnv* env, jobject
LOGV("openNonAssetNative in %p (Java object %p)\n", am, clazz);
- if (fileName == NULL || am == NULL) {
- doThrow(env, "java/lang/NullPointerException");
+ if (fileName == NULL) {
+ jniThrowException(env, "java/lang/NullPointerException", "fileName");
return -1;
}
if (mode != Asset::ACCESS_UNKNOWN && mode != Asset::ACCESS_RANDOM
&& mode != Asset::ACCESS_STREAMING && mode != Asset::ACCESS_BUFFER) {
- doThrow(env, "java/lang/IllegalArgumentException");
+ jniThrowException(env, "java/lang/IllegalArgumentException", "Bad access mode");
return -1;
}
@@ -252,7 +242,7 @@ static jint android_content_AssetManager_openNonAssetNative(JNIEnv* env, jobject
: am->openNonAsset(fileName8, (Asset::AccessMode)mode);
if (a == NULL) {
- doThrow(env, "java/io/FileNotFoundException", fileName8);
+ jniThrowException(env, "java/io/FileNotFoundException", fileName8);
env->ReleaseStringUTFChars(fileName, fileName8);
return -1;
}
@@ -275,8 +265,8 @@ static jobject android_content_AssetManager_openNonAssetFdNative(JNIEnv* env, jo
LOGV("openNonAssetFd in %p (Java object %p)\n", am, clazz);
- if (fileName == NULL || am == NULL) {
- doThrow(env, "java/lang/NullPointerException");
+ if (fileName == NULL ) {
+ jniThrowException(env, "java/lang/NullPointerException", "fileName");
return NULL;
}
@@ -286,7 +276,7 @@ static jobject android_content_AssetManager_openNonAssetFdNative(JNIEnv* env, jo
: am->openNonAsset(fileName8, Asset::ACCESS_RANDOM);
if (a == NULL) {
- doThrow(env, "java/io/FileNotFoundException", fileName8);
+ jniThrowException(env, "java/io/FileNotFoundException", fileName8);
env->ReleaseStringUTFChars(fileName, fileName8);
return NULL;
}
@@ -305,8 +295,8 @@ static jobjectArray android_content_AssetManager_list(JNIEnv* env, jobject clazz
return NULL;
}
- if (fileName == NULL || am == NULL) {
- doThrow(env, "java/lang/NullPointerException");
+ if (fileName == NULL) {
+ jniThrowException(env, "java/lang/NullPointerException", "fileName");
return NULL;
}
@@ -317,7 +307,7 @@ static jobjectArray android_content_AssetManager_list(JNIEnv* env, jobject clazz
env->ReleaseStringUTFChars(fileName, fileName8);
if (dir == NULL) {
- doThrow(env, "java/io/FileNotFoundException", fileName8);
+ jniThrowException(env, "java/io/FileNotFoundException", fileName8);
return NULL;
}
@@ -333,7 +323,6 @@ static jobjectArray android_content_AssetManager_list(JNIEnv* env, jobject clazz
jobjectArray array = env->NewObjectArray(dir->getFileCount(),
cls, NULL);
if (array == NULL) {
- doThrow(env, "java/lang/OutOfMemoryError");
delete dir;
return NULL;
}
@@ -342,11 +331,11 @@ static jobjectArray android_content_AssetManager_list(JNIEnv* env, jobject clazz
const String8& name = dir->getFileName(i);
jstring str = env->NewStringUTF(name.string());
if (str == NULL) {
- doThrow(env, "java/lang/OutOfMemoryError");
delete dir;
return NULL;
}
env->SetObjectArrayElement(array, i, str);
+ env->DeleteLocalRef(str);
}
delete dir;
@@ -362,7 +351,7 @@ static void android_content_AssetManager_destroyAsset(JNIEnv* env, jobject clazz
//printf("Destroying Asset Stream: %p\n", a);
if (a == NULL) {
- doThrow(env, "java/lang/NullPointerException");
+ jniThrowException(env, "java/lang/NullPointerException", "asset");
return;
}
@@ -375,7 +364,7 @@ static jint android_content_AssetManager_readAssetChar(JNIEnv* env, jobject claz
Asset* a = (Asset*)asset;
if (a == NULL) {
- doThrow(env, "java/lang/NullPointerException");
+ jniThrowException(env, "java/lang/NullPointerException", "asset");
return -1;
}
@@ -391,7 +380,7 @@ static jint android_content_AssetManager_readAsset(JNIEnv* env, jobject clazz,
Asset* a = (Asset*)asset;
if (a == NULL || bArray == NULL) {
- doThrow(env, "java/lang/NullPointerException");
+ jniThrowException(env, "java/lang/NullPointerException", "asset");
return -1;
}
@@ -401,7 +390,7 @@ static jint android_content_AssetManager_readAsset(JNIEnv* env, jobject clazz,
jsize bLen = env->GetArrayLength(bArray);
if (off < 0 || off >= bLen || len < 0 || len > bLen || (off+len) > bLen) {
- doThrow(env, "java/lang/IndexOutOfBoundsException");
+ jniThrowException(env, "java/lang/IndexOutOfBoundsException", "");
return -1;
}
@@ -412,7 +401,7 @@ static jint android_content_AssetManager_readAsset(JNIEnv* env, jobject clazz,
if (res > 0) return res;
if (res < 0) {
- doThrow(env, "java/io/IOException");
+ jniThrowException(env, "java/io/IOException", "");
}
return -1;
}
@@ -424,7 +413,7 @@ static jlong android_content_AssetManager_seekAsset(JNIEnv* env, jobject clazz,
Asset* a = (Asset*)asset;
if (a == NULL) {
- doThrow(env, "java/lang/NullPointerException");
+ jniThrowException(env, "java/lang/NullPointerException", "asset");
return -1;
}
@@ -438,7 +427,7 @@ static jlong android_content_AssetManager_getAssetLength(JNIEnv* env, jobject cl
Asset* a = (Asset*)asset;
if (a == NULL) {
- doThrow(env, "java/lang/NullPointerException");
+ jniThrowException(env, "java/lang/NullPointerException", "asset");
return -1;
}
@@ -451,7 +440,7 @@ static jlong android_content_AssetManager_getAssetRemainingLength(JNIEnv* env, j
Asset* a = (Asset*)asset;
if (a == NULL) {
- doThrow(env, "java/lang/NullPointerException");
+ jniThrowException(env, "java/lang/NullPointerException", "asset");
return -1;
}
@@ -462,7 +451,7 @@ static jint android_content_AssetManager_addAssetPath(JNIEnv* env, jobject clazz
jstring path)
{
if (path == NULL) {
- doThrow(env, "java/lang/NullPointerException");
+ jniThrowException(env, "java/lang/NullPointerException", "path");
return JNI_FALSE;
}
@@ -494,7 +483,7 @@ static void android_content_AssetManager_setLocale(JNIEnv* env, jobject clazz,
jstring locale)
{
if (locale == NULL) {
- doThrow(env, "java/lang/NullPointerException");
+ jniThrowException(env, "java/lang/NullPointerException", "locale");
return;
}
@@ -529,7 +518,12 @@ static jobjectArray android_content_AssetManager_getLocales(JNIEnv* env, jobject
}
for (int i=0; i<N; i++) {
- env->SetObjectArrayElement(result, i, env->NewStringUTF(locales[i].string()));
+ jstring str = env->NewStringUTF(locales[i].string());
+ if (str == NULL) {
+ return NULL;
+ }
+ env->SetObjectArrayElement(result, i, str);
+ env->DeleteLocalRef(str);
}
return result;
@@ -580,7 +574,7 @@ static jint android_content_AssetManager_getResourceIdentifier(JNIEnv* env, jobj
jstring defPackage)
{
if (name == NULL) {
- doThrow(env, "java/lang/NullPointerException");
+ jniThrowException(env, "java/lang/NullPointerException", "name");
return 0;
}
@@ -824,14 +818,10 @@ static jstring android_content_AssetManager_getCookieName(JNIEnv* env, jobject c
}
String8 name(am->getAssetPath((void*)cookie));
if (name.length() == 0) {
- doThrow(env, "java/lang/IndexOutOfBoundsException");
+ jniThrowException(env, "java/lang/IndexOutOfBoundsException", "Empty cookie name");
return NULL;
}
jstring str = env->NewStringUTF(name.string());
- if (str == NULL) {
- doThrow(env, "java/lang/OutOfMemoryError");
- return NULL;
- }
return str;
}
@@ -899,7 +889,7 @@ static void android_content_AssetManager_dumpTheme(JNIEnv* env, jobject clazz,
const ResTable& res(theme->getResTable());
if (tag == NULL) {
- doThrow(env, "java/lang/NullPointerException");
+ jniThrowException(env, "java/lang/NullPointerException", "tag");
return;
}
@@ -927,8 +917,16 @@ static jboolean android_content_AssetManager_applyStyle(JNIEnv* env, jobject cla
jintArray outValues,
jintArray outIndices)
{
- if (themeToken == 0 || attrs == NULL || outValues == NULL) {
- doThrow(env, "java/lang/NullPointerException");
+ if (themeToken == 0) {
+ jniThrowException(env, "java/lang/NullPointerException", "theme token");
+ return JNI_FALSE;
+ }
+ if (attrs == NULL) {
+ jniThrowException(env, "java/lang/NullPointerException", "attrs");
+ return JNI_FALSE;
+ }
+ if (outValues == NULL) {
+ jniThrowException(env, "java/lang/NullPointerException", "out values");
return JNI_FALSE;
}
@@ -944,13 +942,13 @@ static jboolean android_content_AssetManager_applyStyle(JNIEnv* env, jobject cla
const jsize NI = env->GetArrayLength(attrs);
const jsize NV = env->GetArrayLength(outValues);
if (NV < (NI*STYLE_NUM_ENTRIES)) {
- doThrow(env, "java/lang/IndexOutOfBoundsException");
+ jniThrowException(env, "java/lang/IndexOutOfBoundsException", "out values too small");
return JNI_FALSE;
}
jint* src = (jint*)env->GetPrimitiveArrayCritical(attrs, 0);
if (src == NULL) {
- doThrow(env, "java/lang/OutOfMemoryError");
+ jniThrowException(env, "java/lang/OutOfMemoryError", "");
return JNI_FALSE;
}
@@ -958,7 +956,7 @@ static jboolean android_content_AssetManager_applyStyle(JNIEnv* env, jobject cla
jint* dest = baseDest;
if (dest == NULL) {
env->ReleasePrimitiveArrayCritical(attrs, src, 0);
- doThrow(env, "java/lang/OutOfMemoryError");
+ jniThrowException(env, "java/lang/OutOfMemoryError", "");
return JNI_FALSE;
}
@@ -1187,8 +1185,16 @@ static jboolean android_content_AssetManager_retrieveAttributes(JNIEnv* env, job
jintArray outValues,
jintArray outIndices)
{
- if (xmlParserToken == 0 || attrs == NULL || outValues == NULL) {
- doThrow(env, "java/lang/NullPointerException");
+ if (xmlParserToken == 0) {
+ jniThrowException(env, "java/lang/NullPointerException", "xmlParserToken");
+ return JNI_FALSE;
+ }
+ if (attrs == NULL) {
+ jniThrowException(env, "java/lang/NullPointerException", "attrs");
+ return JNI_FALSE;
+ }
+ if (outValues == NULL) {
+ jniThrowException(env, "java/lang/NullPointerException", "out values");
return JNI_FALSE;
}
@@ -1204,13 +1210,13 @@ static jboolean android_content_AssetManager_retrieveAttributes(JNIEnv* env, job
const jsize NI = env->GetArrayLength(attrs);
const jsize NV = env->GetArrayLength(outValues);
if (NV < (NI*STYLE_NUM_ENTRIES)) {
- doThrow(env, "java/lang/IndexOutOfBoundsException");
+ jniThrowException(env, "java/lang/IndexOutOfBoundsException", "out values too small");
return JNI_FALSE;
}
jint* src = (jint*)env->GetPrimitiveArrayCritical(attrs, 0);
if (src == NULL) {
- doThrow(env, "java/lang/OutOfMemoryError");
+ jniThrowException(env, "java/lang/OutOfMemoryError", "");
return JNI_FALSE;
}
@@ -1218,7 +1224,7 @@ static jboolean android_content_AssetManager_retrieveAttributes(JNIEnv* env, job
jint* dest = baseDest;
if (dest == NULL) {
env->ReleasePrimitiveArrayCritical(attrs, src, 0);
- doThrow(env, "java/lang/OutOfMemoryError");
+ jniThrowException(env, "java/lang/OutOfMemoryError", "");
return JNI_FALSE;
}
@@ -1341,7 +1347,7 @@ static jint android_content_AssetManager_retrieveArray(JNIEnv* env, jobject claz
jintArray outValues)
{
if (outValues == NULL) {
- doThrow(env, "java/lang/NullPointerException");
+ jniThrowException(env, "java/lang/NullPointerException", "out values");
return JNI_FALSE;
}
@@ -1359,7 +1365,7 @@ static jint android_content_AssetManager_retrieveArray(JNIEnv* env, jobject claz
jint* baseDest = (jint*)env->GetPrimitiveArrayCritical(outValues, 0);
jint* dest = baseDest;
if (dest == NULL) {
- doThrow(env, "java/lang/OutOfMemoryError");
+ jniThrowException(env, "java/lang/OutOfMemoryError", "");
return JNI_FALSE;
}
@@ -1445,8 +1451,8 @@ static jint android_content_AssetManager_openXmlAssetNative(JNIEnv* env, jobject
LOGV("openXmlAsset in %p (Java object %p)\n", am, clazz);
- if (fileName == NULL || am == NULL) {
- doThrow(env, "java/lang/NullPointerException");
+ if (fileName == NULL) {
+ jniThrowException(env, "java/lang/NullPointerException", "fileName");
return 0;
}
@@ -1456,7 +1462,7 @@ static jint android_content_AssetManager_openXmlAssetNative(JNIEnv* env, jobject
: am->openNonAsset(fileName8, Asset::ACCESS_BUFFER);
if (a == NULL) {
- doThrow(env, "java/io/FileNotFoundException", fileName8);
+ jniThrowException(env, "java/io/FileNotFoundException", fileName8);
env->ReleaseStringUTFChars(fileName, fileName8);
return 0;
}
@@ -1468,7 +1474,7 @@ static jint android_content_AssetManager_openXmlAssetNative(JNIEnv* env, jobject
delete a;
if (err != NO_ERROR) {
- doThrow(env, "java/io/FileNotFoundException", "Corrupt XML binary file");
+ jniThrowException(env, "java/io/FileNotFoundException", "Corrupt XML binary file");
return 0;
}
@@ -1492,7 +1498,7 @@ static jintArray android_content_AssetManager_getArrayStringInfo(JNIEnv* env, jo
jintArray array = env->NewIntArray(N * 2);
if (array == NULL) {
- doThrow(env, "java/lang/OutOfMemoryError");
+ jniThrowException(env, "java/lang/OutOfMemoryError", "");
res.unlockBag(startOfBag);
return NULL;
}
@@ -1550,8 +1556,7 @@ static jobjectArray android_content_AssetManager_getArrayStringResource(JNIEnv*
}
jobjectArray array = env->NewObjectArray(N, cls, NULL);
- if (array == NULL) {
- doThrow(env, "java/lang/OutOfMemoryError");
+ if (env->ExceptionCheck()) {
res.unlockBag(startOfBag);
return NULL;
}
@@ -1579,15 +1584,22 @@ static jobjectArray android_content_AssetManager_getArrayStringResource(JNIEnv*
} else {
const char16_t* str16 = pool->stringAt(value.data, &strLen);
str = env->NewString(str16, strLen);
- if (str == NULL) {
- doThrow(env, "java/lang/OutOfMemoryError");
- res.unlockBag(startOfBag);
- return NULL;
- }
}
- }
- env->SetObjectArrayElement(array, i, str);
+ // If one of our NewString{UTF} calls failed due to memory, an
+ // exception will be pending.
+ if (env->ExceptionCheck()) {
+ res.unlockBag(startOfBag);
+ return NULL;
+ }
+
+ env->SetObjectArrayElement(array, i, str);
+
+ // str is not NULL at that point, otherwise ExceptionCheck would have been true.
+ // If we have a large amount of strings in our array, we might
+ // overflow the local reference table of the VM.
+ env->DeleteLocalRef(str);
+ }
}
res.unlockBag(startOfBag);
return array;
@@ -1610,7 +1622,7 @@ static jintArray android_content_AssetManager_getArrayIntResource(JNIEnv* env, j
jintArray array = env->NewIntArray(N);
if (array == NULL) {
- doThrow(env, "java/lang/OutOfMemoryError");
+ jniThrowException(env, "java/lang/OutOfMemoryError", "");
res.unlockBag(startOfBag);
return NULL;
}
@@ -1649,13 +1661,13 @@ static jint android_content_AssetManager_splitThemePackage(JNIEnv* env, jobject
LOGV("splitThemePackage in %p (Java object %p)\n", am, clazz);
if (srcFileName == NULL || dstFileName == NULL) {
- doThrow(env, "java/lang/NullPointerException");
+ jniThrowException(env, "java/lang/NullPointerException", srcFileName == NULL ? "srcFileName" : "dstFileName");
return -2;
}
jsize size = env->GetArrayLength(drmProtectedAssetNames);
if (size == 0) {
- doThrow(env, "java/lang/IllegalArgumentException");
+ jniThrowException(env, "java/lang/IllegalArgumentException", "drmProtectedAssetNames");
return -3;
}
@@ -1720,7 +1732,7 @@ static void android_content_AssetManager_init(JNIEnv* env, jobject clazz)
{
AssetManager* am = new AssetManager();
if (am == NULL) {
- doThrow(env, "java/lang/OutOfMemoryError");
+ jniThrowException(env, "java/lang/OutOfMemoryError", "");
return;
}
@@ -1754,11 +1766,6 @@ static jobject android_content_AssetManager_getAssetAllocations(JNIEnv* env, job
}
jstring str = env->NewStringUTF(alloc.string());
- if (str == NULL) {
- doThrow(env, "java/lang/OutOfMemoryError");
- return NULL;
- }
-
return str;
}
@@ -1803,7 +1810,7 @@ static jboolean android_content_AssetManager_removeAssetPath(JNIEnv* env, jobjec
jstring packageName, jint cookie)
{
if (packageName == NULL) {
- doThrow(env, "java/lang/NullPointerException");
+ jniThrowException(env, "java/lang/NullPointerException", "packageName");
return JNI_FALSE;
}
@@ -1823,7 +1830,7 @@ static jint android_content_AssetManager_updateResourcesWithAssetPath(
JNIEnv* env, jobject clazz, jstring path)
{
if (path == NULL) {
- doThrow(env, "java/lang/NullPointerException");
+ jniThrowException(env, "java/lang/NullPointerException", "path");
return JNI_FALSE;
}