diff options
Diffstat (limited to 'core/jni/AndroidRuntime.cpp')
-rw-r--r-- | core/jni/AndroidRuntime.cpp | 385 |
1 files changed, 142 insertions, 243 deletions
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index 1fbd4a1..f94341a 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -95,8 +95,6 @@ extern int register_android_media_AudioTrack(JNIEnv *env); extern int register_android_media_JetPlayer(JNIEnv *env); extern int register_android_media_ToneGenerator(JNIEnv *env); -extern int register_android_util_FloatMath(JNIEnv* env); - namespace android { /* @@ -164,7 +162,6 @@ extern int register_android_text_AndroidBidi(JNIEnv *env); extern int register_android_opengl_classes(JNIEnv *env); extern int register_android_ddm_DdmHandleNativeHeap(JNIEnv *env); extern int register_android_server_NetworkManagementSocketTagger(JNIEnv* env); -extern int register_com_android_internal_os_ZygoteInit(JNIEnv* env); extern int register_android_backup_BackupDataInput(JNIEnv *env); extern int register_android_backup_BackupDataOutput(JNIEnv *env); extern int register_android_backup_FileBackupHelperBase(JNIEnv *env); @@ -193,12 +190,6 @@ extern int register_com_android_internal_util_VirtualRefBasePtr(JNIEnv *env); static AndroidRuntime* gCurRuntime = NULL; -static void doThrow(JNIEnv* env, const char* exc, const char* msg = NULL) -{ - if (jniThrowException(env, exc, msg) != 0) - assert(false); -} - /* * Code written in the Java Programming Language calls here from main(). */ @@ -366,22 +357,37 @@ static bool hasFile(const char* file) { } /* - * Read the persistent locale. + * Read the persistent locale. Attempts to read to persist.sys.locale + * and falls back to the default locale (ro.product.locale) if + * persist.sys.locale is empty. */ -static void readLocale(char* language, char* region) +static void readLocale(char* locale) { - char propLang[PROPERTY_VALUE_MAX], propRegn[PROPERTY_VALUE_MAX]; - - property_get("persist.sys.language", propLang, ""); - property_get("persist.sys.country", propRegn, ""); - if (*propLang == 0 && *propRegn == 0) { - /* Set to ro properties, default is en_US */ - property_get("ro.product.locale.language", propLang, "en"); - property_get("ro.product.locale.region", propRegn, "US"); + // Allocate 4 extra bytes because we might read a property into + // this array at offset 4. + char propLocale[PROPERTY_VALUE_MAX + 4]; + + property_get("persist.sys.locale", propLocale, ""); + if (propLocale[0] == 0) { + property_get("ro.product.locale", propLocale, ""); + + if (propLocale[0] == 0) { + // If persist.sys.locale and ro.product.locale are missing, + // construct a locale value from the individual locale components. + property_get("ro.product.locale.language", propLocale, "en"); + + // The language code is either two or three chars in length. If it + // isn't 2 chars long, assume three. Anything else is an error + // anyway. + const int offset = (propLocale[2] == 0) ? 2 : 3; + propLocale[offset] = '-'; + + property_get("ro.product.locale.region", propLocale + offset + 1, "US"); + } } - strncat(language, propLang, 3); - strncat(region, propRegn, 3); - //ALOGD("language=%s region=%s\n", language, region); + + strncat(locale, propLocale, PROPERTY_VALUE_MAX); + // ALOGD("[DEBUG] locale=%s", locale); } void AndroidRuntime::addOption(const char* optionString, void* extraInfo) @@ -534,8 +540,6 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv) JavaVMInitArgs initArgs; char propBuf[PROPERTY_VALUE_MAX]; char stackTraceFileBuf[sizeof("-Xstacktracefile:")-1 + PROPERTY_VALUE_MAX]; - char dexoptFlagsBuf[PROPERTY_VALUE_MAX]; - char enableAssertBuf[sizeof("-ea:")-1 + PROPERTY_VALUE_MAX]; char jniOptsBuf[sizeof("-Xjniopts:")-1 + PROPERTY_VALUE_MAX]; char heapstartsizeOptsBuf[sizeof("-Xms")-1 + PROPERTY_VALUE_MAX]; char heapsizeOptsBuf[sizeof("-Xmx")-1 + PROPERTY_VALUE_MAX]; @@ -545,8 +549,6 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv) char gctypeOptsBuf[sizeof("-Xgc:")-1 + PROPERTY_VALUE_MAX]; char backgroundgcOptsBuf[sizeof("-XX:BackgroundGC=")-1 + PROPERTY_VALUE_MAX]; char heaptargetutilizationOptsBuf[sizeof("-XX:HeapTargetUtilization=")-1 + PROPERTY_VALUE_MAX]; - char jitcodecachesizeOptsBuf[sizeof("-Xjitcodecachesize:")-1 + PROPERTY_VALUE_MAX]; - char dalvikVmLibBuf[PROPERTY_VALUE_MAX]; char dex2oatXmsImageFlagsBuf[sizeof("-Xms")-1 + PROPERTY_VALUE_MAX]; char dex2oatXmxImageFlagsBuf[sizeof("-Xmx")-1 + PROPERTY_VALUE_MAX]; char dex2oatXmsFlagsBuf[sizeof("-Xms")-1 + PROPERTY_VALUE_MAX]; @@ -572,11 +574,8 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv) PROPERTY_VALUE_MAX]; char profileType[sizeof("-Xprofile-type:")-1 + PROPERTY_VALUE_MAX]; char profileMaxStackDepth[sizeof("-Xprofile-max-stack-depth:")-1 + PROPERTY_VALUE_MAX]; - char langOption[sizeof("-Duser.language=") + 3]; - char regionOption[sizeof("-Duser.region=") + 3]; + char localeOption[sizeof("-Duser.locale=") + PROPERTY_VALUE_MAX]; char lockProfThresholdBuf[sizeof("-Xlockprofthreshold:")-1 + PROPERTY_VALUE_MAX]; - char jitOpBuf[sizeof("-Xjitop:")-1 + PROPERTY_VALUE_MAX]; - char jitMethodBuf[sizeof("-Xjitmethod:")-1 + PROPERTY_VALUE_MAX]; char nativeBridgeLibrary[sizeof("-XX:NativeBridge=") + PROPERTY_VALUE_MAX]; bool checkJni = false; @@ -595,9 +594,6 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv) /* extended JNI checking */ addOption("-Xcheck:jni"); - /* set a cap on JNI global references */ - addOption("-Xjnigreflimit:2000"); - /* with -Xcheck:jni, this provides a JNI function call trace */ //addOption("-verbose:jni"); } @@ -613,30 +609,6 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv) parseRuntimeOption("dalvik.vm.stack-trace-file", stackTraceFileBuf, "-Xstacktracefile:"); - property_get("dalvik.vm.check-dex-sum", propBuf, ""); - if (strcmp(propBuf, "true") == 0) { - /* perform additional DEX checksum tests */ - addOption("-Xcheckdexsum"); - } - - property_get("log.redirect-stdio", propBuf, ""); - if (strcmp(propBuf, "true") == 0) { - /* convert stdout/stderr to log messages */ - addOption("-Xlog-stdio"); - } - - strcpy(enableAssertBuf, "-ea:"); - property_get("dalvik.vm.enableassertions", enableAssertBuf+sizeof("-ea:")-1, ""); - if (enableAssertBuf[sizeof("-ea:")-1] != '\0') { - /* accept "all" to mean "all classes and packages" */ - if (strcmp(enableAssertBuf+sizeof("-ea:")-1, "all") == 0) - enableAssertBuf[3] = '\0'; // truncate to "-ea" - ALOGI("Assertions enabled: '%s'\n", enableAssertBuf); - addOption(enableAssertBuf); - } else { - ALOGV("Assertions disabled\n"); - } - strcpy(jniOptsBuf, "-Xjniopts:"); if (parseRuntimeOption("dalvik.vm.jniopts", jniOptsBuf, "-Xjniopts:")) { ALOGI("JNI options: '%s'\n", jniOptsBuf); @@ -663,14 +635,6 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv) parseRuntimeOption("dalvik.vm.heapstartsize", heapstartsizeOptsBuf, "-Xms", "4m"); parseRuntimeOption("dalvik.vm.heapsize", heapsizeOptsBuf, "-Xmx", "16m"); - // Increase the main thread's interpreter stack size for bug 6315322. - addOption("-XX:mainThreadStackSize=24K"); - - // Set the max jit code cache size. Note: size of 0 will disable the JIT. - parseRuntimeOption("dalvik.vm.jit.codecachesize", - jitcodecachesizeOptsBuf, - "-Xjitcodecachesize:"); - parseRuntimeOption("dalvik.vm.heapgrowthlimit", heapgrowthlimitOptsBuf, "-XX:HeapGrowthLimit="); parseRuntimeOption("dalvik.vm.heapminfree", heapminfreeOptsBuf, "-XX:HeapMinFree="); parseRuntimeOption("dalvik.vm.heapmaxfree", heapmaxfreeOptsBuf, "-XX:HeapMaxFree="); @@ -686,53 +650,6 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv) parseRuntimeOption("dalvik.vm.gctype", gctypeOptsBuf, "-Xgc:"); parseRuntimeOption("dalvik.vm.backgroundgctype", backgroundgcOptsBuf, "-XX:BackgroundGC="); - /* - * Enable or disable dexopt features, such as bytecode verification and - * calculation of register maps for precise GC. - */ - property_get("dalvik.vm.dexopt-flags", dexoptFlagsBuf, ""); - if (dexoptFlagsBuf[0] != '\0') { - const char* opc; - const char* val; - - opc = strstr(dexoptFlagsBuf, "v="); /* verification */ - if (opc != NULL) { - switch (*(opc+2)) { - case 'n': val = "-Xverify:none"; break; - case 'r': val = "-Xverify:remote"; break; - case 'a': val = "-Xverify:all"; break; - default: val = NULL; break; - } - - if (val != NULL) { - addOption(val); - } - } - - opc = strstr(dexoptFlagsBuf, "o="); /* optimization */ - if (opc != NULL) { - switch (*(opc+2)) { - case 'n': val = "-Xdexopt:none"; break; - case 'v': val = "-Xdexopt:verified"; break; - case 'a': val = "-Xdexopt:all"; break; - case 'f': val = "-Xdexopt:full"; break; - default: val = NULL; break; - } - - if (val != NULL) { - addOption(val); - } - } - - opc = strstr(dexoptFlagsBuf, "m=y"); /* register map */ - if (opc != NULL) { - addOption("-Xgenregmap"); - - /* turn on precise GC while we're at it */ - addOption("-Xgc:precise"); - } - } - /* enable debugging; set suspend=y to pause during VM init */ /* use android ADB transport */ addOption("-agentlib:jdwp=transport=dt_android_adb,suspend=n,server=y"); @@ -741,12 +658,6 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv) lockProfThresholdBuf, "-Xlockprofthreshold:"); - /* Force interpreter-only mode for selected opcodes. Eg "1-0a,3c,f1-ff" */ - parseRuntimeOption("dalvik.vm.jit.op", jitOpBuf, "-Xjitop:"); - - /* Force interpreter-only mode for selected methods */ - parseRuntimeOption("dalvik.vm.jit.method", jitMethodBuf, "-Xjitmethod:"); - if (executionMode == kEMIntPortable) { addOption("-Xint:portable"); } else if (executionMode == kEMIntFast) { @@ -755,63 +666,64 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv) addOption("-Xint:jit"); } - // libart tolerates libdvm flags, but not vice versa, so only pass some options if libart. - property_get("persist.sys.dalvik.vm.lib.2", dalvikVmLibBuf, "libart.so"); - bool libart = (strncmp(dalvikVmLibBuf, "libart", 6) == 0); - - if (libart) { - // If we booting without the real /data, don't spend time compiling. - property_get("vold.decrypt", voldDecryptBuf, ""); - bool skip_compilation = ((strcmp(voldDecryptBuf, "trigger_restart_min_framework") == 0) || - (strcmp(voldDecryptBuf, "1") == 0)); - - // Extra options for boot.art/boot.oat image generation. - parseCompilerRuntimeOption("dalvik.vm.image-dex2oat-Xms", dex2oatXmsImageFlagsBuf, - "-Xms", "-Ximage-compiler-option"); - parseCompilerRuntimeOption("dalvik.vm.image-dex2oat-Xmx", dex2oatXmxImageFlagsBuf, - "-Xmx", "-Ximage-compiler-option"); - if (skip_compilation) { - addOption("-Ximage-compiler-option"); - addOption("--compiler-filter=verify-none"); - } else { - parseCompilerOption("dalvik.vm.image-dex2oat-filter", dex2oatImageCompilerFilterBuf, - "--compiler-filter=", "-Ximage-compiler-option"); - } - - // Make sure there is a preloaded-classes file. - if (!hasFile("/system/etc/preloaded-classes")) { - ALOGE("Missing preloaded-classes file, /system/etc/preloaded-classes not found: %s\n", - strerror(errno)); - goto bail; - } + // If we are booting without the real /data, don't spend time compiling. + property_get("vold.decrypt", voldDecryptBuf, ""); + bool skip_compilation = ((strcmp(voldDecryptBuf, "trigger_restart_min_framework") == 0) || + (strcmp(voldDecryptBuf, "1") == 0)); + + // Extra options for boot.art/boot.oat image generation. + parseCompilerRuntimeOption("dalvik.vm.image-dex2oat-Xms", dex2oatXmsImageFlagsBuf, + "-Xms", "-Ximage-compiler-option"); + parseCompilerRuntimeOption("dalvik.vm.image-dex2oat-Xmx", dex2oatXmxImageFlagsBuf, + "-Xmx", "-Ximage-compiler-option"); + if (skip_compilation) { addOption("-Ximage-compiler-option"); - addOption("--image-classes=/system/etc/preloaded-classes"); + addOption("--compiler-filter=verify-none"); + } else { + parseCompilerOption("dalvik.vm.image-dex2oat-filter", dex2oatImageCompilerFilterBuf, + "--compiler-filter=", "-Ximage-compiler-option"); + } - // If there is a compiled-classes file, push it. - if (hasFile("/system/etc/compiled-classes")) { - addOption("-Ximage-compiler-option"); - addOption("--compiled-classes=/system/etc/compiled-classes"); - } + // Make sure there is a preloaded-classes file. + if (!hasFile("/system/etc/preloaded-classes")) { + ALOGE("Missing preloaded-classes file, /system/etc/preloaded-classes not found: %s\n", + strerror(errno)); + goto bail; + } + addOption("-Ximage-compiler-option"); + addOption("--image-classes=/system/etc/preloaded-classes"); - property_get("dalvik.vm.image-dex2oat-flags", dex2oatImageFlagsBuf, ""); - parseExtraOpts(dex2oatImageFlagsBuf, "-Ximage-compiler-option"); - - // Extra options for DexClassLoader. - parseCompilerRuntimeOption("dalvik.vm.dex2oat-Xms", dex2oatXmsFlagsBuf, - "-Xms", "-Xcompiler-option"); - parseCompilerRuntimeOption("dalvik.vm.dex2oat-Xmx", dex2oatXmxFlagsBuf, - "-Xmx", "-Xcompiler-option"); - if (skip_compilation) { - addOption("-Xcompiler-option"); - addOption("--compiler-filter=verify-none"); - } else { - parseCompilerOption("dalvik.vm.dex2oat-filter", dex2oatCompilerFilterBuf, - "--compiler-filter=", "-Xcompiler-option"); - } - property_get("dalvik.vm.dex2oat-flags", dex2oatFlagsBuf, ""); - parseExtraOpts(dex2oatFlagsBuf, "-Xcompiler-option"); + // If there is a compiled-classes file, push it. + if (hasFile("/system/etc/compiled-classes")) { + addOption("-Ximage-compiler-option"); + addOption("--compiled-classes=/system/etc/compiled-classes"); + } + property_get("dalvik.vm.image-dex2oat-flags", dex2oatImageFlagsBuf, ""); + parseExtraOpts(dex2oatImageFlagsBuf, "-Ximage-compiler-option"); + + // Extra options for DexClassLoader. + parseCompilerRuntimeOption("dalvik.vm.dex2oat-Xms", dex2oatXmsFlagsBuf, + "-Xms", "-Xcompiler-option"); + parseCompilerRuntimeOption("dalvik.vm.dex2oat-Xmx", dex2oatXmxFlagsBuf, + "-Xmx", "-Xcompiler-option"); + if (skip_compilation) { + addOption("-Xcompiler-option"); + addOption("--compiler-filter=verify-none"); + + // We skip compilation when a minimal runtime is brought up for decryption. In that case + // /data is temporarily backed by a tmpfs, which is usually small. + // If the system image contains prebuilts, they will be relocated into the tmpfs. In this + // specific situation it is acceptable to *not* relocate and run out of the prebuilts + // directly instead. + addOption("--runtime-arg"); + addOption("-Xnorelocate"); + } else { + parseCompilerOption("dalvik.vm.dex2oat-filter", dex2oatCompilerFilterBuf, + "--compiler-filter=", "-Xcompiler-option"); } + property_get("dalvik.vm.dex2oat-flags", dex2oatFlagsBuf, ""); + parseExtraOpts(dex2oatFlagsBuf, "-Xcompiler-option"); /* extra options; parse this late so it overrides others */ property_get("dalvik.vm.extra-opts", extraOptsBuf, ""); @@ -819,77 +731,73 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv) /* Set the properties for locale */ { - strcpy(langOption, "-Duser.language="); - strcpy(regionOption, "-Duser.region="); - readLocale(langOption, regionOption); - addOption(langOption); - addOption(regionOption); + strcpy(localeOption, "-Duser.locale="); + readLocale(localeOption); + addOption(localeOption); } /* * Set profiler options */ - if (libart) { - // Whether or not the profiler should be enabled. - property_get("dalvik.vm.profiler", propBuf, "0"); - if (propBuf[0] == '1') { - addOption("-Xenable-profiler"); - } + // Whether or not the profiler should be enabled. + property_get("dalvik.vm.profiler", propBuf, "0"); + if (propBuf[0] == '1') { + addOption("-Xenable-profiler"); + } - // Whether the profile should start upon app startup or be delayed by some random offset - // (in seconds) that is bound between 0 and a fixed value. - property_get("dalvik.vm.profile.start-immed", propBuf, "0"); - if (propBuf[0] == '1') { - addOption("-Xprofile-start-immediately"); - } + // Whether the profile should start upon app startup or be delayed by some random offset + // (in seconds) that is bound between 0 and a fixed value. + property_get("dalvik.vm.profile.start-immed", propBuf, "0"); + if (propBuf[0] == '1') { + addOption("-Xprofile-start-immediately"); + } - // Number of seconds during profile runs. - parseRuntimeOption("dalvik.vm.profile.period-secs", profilePeriod, "-Xprofile-period:"); - - // Length of each profile run (seconds). - parseRuntimeOption("dalvik.vm.profile.duration-secs", - profileDuration, - "-Xprofile-duration:"); - - // Polling interval during profile run (microseconds). - parseRuntimeOption("dalvik.vm.profile.interval-us", profileInterval, "-Xprofile-interval:"); - - // Coefficient for period backoff. The the period is multiplied - // by this value after each profile run. - parseRuntimeOption("dalvik.vm.profile.backoff-coeff", profileBackoff, "-Xprofile-backoff:"); - - // Top K% of samples that are considered relevant when - // deciding if the app should be recompiled. - parseRuntimeOption("dalvik.vm.profile.top-k-thr", - profileTopKThreshold, - "-Xprofile-top-k-threshold:"); - - // The threshold after which a change in the structure of the - // top K% profiled samples becomes significant and triggers - // recompilation. A change in profile is considered - // significant if X% (top-k-change-threshold) of the top K% - // (top-k-threshold property) samples has changed. - parseRuntimeOption("dalvik.vm.profile.top-k-ch-thr", - profileTopKChangeThreshold, - "-Xprofile-top-k-change-threshold:"); - - // Type of profile data. - parseRuntimeOption("dalvik.vm.profiler.type", profileType, "-Xprofile-type:"); - - // Depth of bounded stack data - parseRuntimeOption("dalvik.vm.profile.stack-depth", - profileMaxStackDepth, - "-Xprofile-max-stack-depth:"); - - // Native bridge library. "0" means that native bridge is disabled. - property_get("ro.dalvik.vm.native.bridge", propBuf, ""); - if (propBuf[0] == '\0') { - ALOGW("ro.dalvik.vm.native.bridge is not expected to be empty"); - } else if (strcmp(propBuf, "0") != 0) { - snprintf(nativeBridgeLibrary, sizeof("-XX:NativeBridge=") + PROPERTY_VALUE_MAX, - "-XX:NativeBridge=%s", propBuf); - addOption(nativeBridgeLibrary); - } + // Number of seconds during profile runs. + parseRuntimeOption("dalvik.vm.profile.period-secs", profilePeriod, "-Xprofile-period:"); + + // Length of each profile run (seconds). + parseRuntimeOption("dalvik.vm.profile.duration-secs", + profileDuration, + "-Xprofile-duration:"); + + // Polling interval during profile run (microseconds). + parseRuntimeOption("dalvik.vm.profile.interval-us", profileInterval, "-Xprofile-interval:"); + + // Coefficient for period backoff. The the period is multiplied + // by this value after each profile run. + parseRuntimeOption("dalvik.vm.profile.backoff-coeff", profileBackoff, "-Xprofile-backoff:"); + + // Top K% of samples that are considered relevant when + // deciding if the app should be recompiled. + parseRuntimeOption("dalvik.vm.profile.top-k-thr", + profileTopKThreshold, + "-Xprofile-top-k-threshold:"); + + // The threshold after which a change in the structure of the + // top K% profiled samples becomes significant and triggers + // recompilation. A change in profile is considered + // significant if X% (top-k-change-threshold) of the top K% + // (top-k-threshold property) samples has changed. + parseRuntimeOption("dalvik.vm.profile.top-k-ch-thr", + profileTopKChangeThreshold, + "-Xprofile-top-k-change-threshold:"); + + // Type of profile data. + parseRuntimeOption("dalvik.vm.profiler.type", profileType, "-Xprofile-type:"); + + // Depth of bounded stack data + parseRuntimeOption("dalvik.vm.profile.stack-depth", + profileMaxStackDepth, + "-Xprofile-max-stack-depth:"); + + // Native bridge library. "0" means that native bridge is disabled. + property_get("ro.dalvik.vm.native.bridge", propBuf, ""); + if (propBuf[0] == '\0') { + ALOGW("ro.dalvik.vm.native.bridge is not expected to be empty"); + } else if (strcmp(propBuf, "0") != 0) { + snprintf(nativeBridgeLibrary, sizeof("-XX:NativeBridge=") + PROPERTY_VALUE_MAX, + "-XX:NativeBridge=%s", propBuf); + addOption(nativeBridgeLibrary); } initArgs.version = JNI_VERSION_1_4; @@ -1237,19 +1145,11 @@ static int register_jni_procs(const RegJNIRec array[], size_t count, JNIEnv* env return 0; } -static void register_jam_procs(const RegJAMProc array[], size_t count) -{ - for (size_t i = 0; i < count; i++) { - array[i](); - } -} - static const RegJNIRec gRegJNI[] = { REG_JNI(register_com_android_internal_os_RuntimeInit), REG_JNI(register_android_os_SystemClock), REG_JNI(register_android_util_EventLog), REG_JNI(register_android_util_Log), - REG_JNI(register_android_util_FloatMath), REG_JNI(register_android_content_AssetManager), REG_JNI(register_android_content_StringBlock), REG_JNI(register_android_content_XmlBlock), @@ -1337,7 +1237,6 @@ static const RegJNIRec gRegJNI[] = { REG_JNI(register_android_net_NetworkUtils), REG_JNI(register_android_net_TrafficStats), REG_JNI(register_android_os_MemoryFile), - REG_JNI(register_com_android_internal_os_ZygoteInit), REG_JNI(register_com_android_internal_os_Zygote), REG_JNI(register_com_android_internal_util_VirtualRefBasePtr), REG_JNI(register_android_hardware_Camera), |