summaryrefslogtreecommitdiffstats
path: root/core/jni/com_android_internal_content_NativeLibraryHelper.cpp
diff options
context:
space:
mode:
authorNarayan Kamath <narayan@google.com>2014-06-03 13:58:35 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2014-06-03 13:58:35 +0000
commitc32a244e907719e03d0fae42b20401dcd2c595fc (patch)
tree6aa66d59b39ddf1a1e378fb60473a6b011dc4398 /core/jni/com_android_internal_content_NativeLibraryHelper.cpp
parent5770f2bfab686bd455d5999a76eed7d16098f453 (diff)
parentdd2e9d3386d2d74f99f79bcad951ff5cdefa6fab (diff)
downloadframeworks_base-c32a244e907719e03d0fae42b20401dcd2c595fc.zip
frameworks_base-c32a244e907719e03d0fae42b20401dcd2c595fc.tar.gz
frameworks_base-c32a244e907719e03d0fae42b20401dcd2c595fc.tar.bz2
am dd2e9d33: am 7cb13f8a: Merge "Scan for renderscript files before deciding ABIs."
* commit 'dd2e9d3386d2d74f99f79bcad951ff5cdefa6fab': Scan for renderscript files before deciding ABIs.
Diffstat (limited to 'core/jni/com_android_internal_content_NativeLibraryHelper.cpp')
-rw-r--r--core/jni/com_android_internal_content_NativeLibraryHelper.cpp41
1 files changed, 41 insertions, 0 deletions
diff --git a/core/jni/com_android_internal_content_NativeLibraryHelper.cpp b/core/jni/com_android_internal_content_NativeLibraryHelper.cpp
index 230658f..e55e4ea 100644
--- a/core/jni/com_android_internal_content_NativeLibraryHelper.cpp
+++ b/core/jni/com_android_internal_content_NativeLibraryHelper.cpp
@@ -46,6 +46,9 @@
#define LIB_SUFFIX ".so"
#define LIB_SUFFIX_LEN (sizeof(LIB_SUFFIX) - 1)
+#define RS_BITCODE_SUFFIX ".bc"
+#define RS_BITCODE_SUFFIX_LEN (sizeof(RS_BITCODE_SUFFIX) -1)
+
#define GDBSERVER "gdbserver"
#define GDBSERVER_LEN (sizeof(GDBSERVER) - 1)
@@ -486,6 +489,42 @@ com_android_internal_content_NativeLibraryHelper_findSupportedAbi(JNIEnv *env, j
return (jint) findSupportedAbi(env, apkHandle, javaCpuAbisToSearch);
}
+enum bitcode_scan_result_t {
+ APK_SCAN_ERROR = -1,
+ NO_BITCODE_PRESENT = 0,
+ BITCODE_PRESENT = 1,
+};
+
+static jint
+com_android_internal_content_NativeLibraryHelper_hasRenderscriptBitcode(JNIEnv *env, jclass clazz,
+ jlong apkHandle) {
+ ZipFileRO* zipFile = reinterpret_cast<ZipFileRO*>(apkHandle);
+ void* cookie = NULL;
+ if (!zipFile->startIteration(&cookie)) {
+ return APK_SCAN_ERROR;
+ }
+
+ char fileName[PATH_MAX];
+ ZipEntryRO next = NULL;
+ while ((next = zipFile->nextEntry(cookie)) != NULL) {
+ if (zipFile->getEntryFileName(next, fileName, sizeof(fileName))) {
+ continue;
+ }
+
+ const size_t fileNameLen = strlen(fileName);
+ const char* lastSlash = strrchr(fileName, '/');
+ const char* baseName = (lastSlash == NULL) ? fileName : fileName + 1;
+ if (!strncmp(fileName + fileNameLen - RS_BITCODE_SUFFIX_LEN, RS_BITCODE_SUFFIX,
+ RS_BITCODE_SUFFIX_LEN) && isFilenameSafe(baseName)) {
+ zipFile->endIteration(cookie);
+ return BITCODE_PRESENT;
+ }
+ }
+
+ zipFile->endIteration(cookie);
+ return NO_BITCODE_PRESENT;
+}
+
static jlong
com_android_internal_content_NativeLibraryHelper_openApk(JNIEnv *env, jclass, jstring apkPath)
{
@@ -517,6 +556,8 @@ static JNINativeMethod gMethods[] = {
{"nativeFindSupportedAbi",
"(J[Ljava/lang/String;)I",
(void *)com_android_internal_content_NativeLibraryHelper_findSupportedAbi},
+ {"hasRenderscriptBitcode", "(J)I",
+ (void *)com_android_internal_content_NativeLibraryHelper_hasRenderscriptBitcode},
};