From 10410fc85248ea77c2c1fbbb666c3fe4fcfef1b6 Mon Sep 17 00:00:00 2001 From: Anthony Mazzola Date: Tue, 20 Dec 2011 13:49:09 -0800 Subject: [PATCH] Fix issue with selecting proper JNI libraries Current code will load both abi and abi2 versions of the JNI libraries. The second one found will be the library in use. Update algorithm so that abi2 libraries will never be loaded once we find a library that supports the primary abi. This is consistent with the original implementation. Bug: 5787224 Change-Id: Ib4d30bea8316ca9bf62757c970dcc5b75cd969ec --- ...roid_internal_content_NativeLibraryHelper.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/core/jni/com_android_internal_content_NativeLibraryHelper.cpp b/core/jni/com_android_internal_content_NativeLibraryHelper.cpp index 5118351342bee..95c9b49ac98d9 100644 --- a/core/jni/com_android_internal_content_NativeLibraryHelper.cpp +++ b/core/jni/com_android_internal_content_NativeLibraryHelper.cpp @@ -283,6 +283,7 @@ iterateOverNativeFiles(JNIEnv *env, jstring javaFilePath, jstring javaCpuAbi, js const int N = zipFile.getNumEntries(); char fileName[PATH_MAX]; + bool hasPrimaryAbi = false; for (int i = 0; i < N; i++) { const ZipEntryRO entry = zipFile.findEntryByIndex(i); @@ -318,11 +319,22 @@ iterateOverNativeFiles(JNIEnv *env, jstring javaFilePath, jstring javaCpuAbi, js if (cpuAbi.size() == cpuAbiRegionSize && *(cpuAbiOffset + cpuAbi.size()) == '/' && !strncmp(cpuAbiOffset, cpuAbi.c_str(), cpuAbiRegionSize)) { - LOGV("Using ABI %s\n", cpuAbi.c_str()); + LOGV("Using primary ABI %s\n", cpuAbi.c_str()); + hasPrimaryAbi = true; } else if (cpuAbi2.size() == cpuAbiRegionSize && *(cpuAbiOffset + cpuAbi2.size()) == '/' && !strncmp(cpuAbiOffset, cpuAbi2.c_str(), cpuAbiRegionSize)) { - LOGV("Using ABI %s\n", cpuAbi2.c_str()); + + /* + * If this library matches both the primary and secondary ABIs, + * only use the primary ABI. + */ + if (hasPrimaryAbi) { + LOGV("Already saw primary ABI, skipping secondary ABI %s\n", cpuAbi2.c_str()); + continue; + } else { + LOGV("Using secondary ABI %s\n", cpuAbi2.c_str()); + } } else { LOGV("abi didn't match anything: %s (end at %zd)\n", cpuAbiOffset, cpuAbiRegionSize); continue;