`
1025250620
  • 浏览: 229924 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android C+源码笔记(1)

 
阅读更多

 

const char* rootDir = getenv("ANDROID_ROOT");

    if (rootDir == NULL) {

        rootDir = "/system";

        if (!hasDir("/system")) {

            return;

        }

        setenv("ANDROID_ROOT", rootDir, 1);

}

设置环境变量

 

int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv)

//pJavaVM Runtime 静态量

{

    int result = -1;

    JavaVMInitArgs initArgs;

    JavaVMOption opt;

    char propBuf[PROPERTY_VALUE_MAX];

    char stackTraceFileBuf[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];

    char heapgrowthlimitOptsBuf[sizeof("-XX:HeapGrowthLimit=")-1 + PROPERTY_VALUE_MAX];

    char extraOptsBuf[PROPERTY_VALUE_MAX];

    char* stackTraceFile = NULL;

    bool checkJni = false;

    bool checkDexSum = false;

    bool logStdio = false;

    enum {

      kEMDefault,

      kEMIntPortable,

      kEMIntFast,

#if defined(WITH_JIT)

      kEMJitCompiler,

#endif

    } executionMode = kEMDefault;

 

 

    property_get("dalvik.vm.checkjni", propBuf, "");

    if (strcmp(propBuf, "true") == 0) {

        checkJni = true;

    } else if (strcmp(propBuf, "false") != 0) {

        /* property is neither true nor false; fall back on kernel parameter */

        property_get("ro.kernel.android.checkjni", propBuf, "");

        if (propBuf[0] == '1') {

            checkJni = true;

        }

    }

 

    property_get("dalvik.vm.execution-mode", propBuf, "");

    if (strcmp(propBuf, "int:portable") == 0) {

        executionMode = kEMIntPortable;

    } else if (strcmp(propBuf, "int:fast") == 0) {

        executionMode = kEMIntFast;

#if defined(WITH_JIT)

    } else if (strcmp(propBuf, "int:jit") == 0) {

        executionMode = kEMJitCompiler;

#endif

    }

 

    property_get("dalvik.vm.stack-trace-file", stackTraceFileBuf, "");

 

    property_get("dalvik.vm.check-dex-sum", propBuf, "");

    if (strcmp(propBuf, "true") == 0) {

        checkDexSum = true;

    }

 

    property_get("log.redirect-stdio", propBuf, "");

    if (strcmp(propBuf, "true") == 0) {

        logStdio = true;

    }

 

    strcpy(enableAssertBuf, "-ea:");

    property_get("dalvik.vm.enableassertions", enableAssertBuf+4, "");

 

    strcpy(jniOptsBuf, "-Xjniopts:");

    property_get("dalvik.vm.jniopts", jniOptsBuf+10, "");

 

    /* route exit() to our handler */

    opt.extraInfo = (void*) runtime_exit;

    opt.optionString = "exit";

    mOptions.add(opt);

 

    /* route fprintf() to our handler */

    opt.extraInfo = (void*) runtime_vfprintf;

    opt.optionString = "vfprintf";

    mOptions.add(opt);

 

    /* register the framework-specific "is sensitive thread" hook */

    opt.extraInfo = (void*) runtime_isSensitiveThread;

    opt.optionString = "sensitiveThread";

    mOptions.add(opt);

 

    opt.extraInfo = NULL;

 

    /* enable verbose; standard options are { jni, gc, class } */

    //options[curOpt++].optionString = "-verbose:jni";

    opt.optionString = "-verbose:gc";

    mOptions.add(opt);

    //options[curOpt++].optionString = "-verbose:class";

 

    /*

     * The default starting and maximum size of the heap.  Larger

     * values should be specified in a product property override.

     */

    strcpy(heapstartsizeOptsBuf, "-Xms");

    property_get("dalvik.vm.heapstartsize", heapstartsizeOptsBuf+4, "4m");

    opt.optionString = heapstartsizeOptsBuf;

    mOptions.add(opt);

    strcpy(heapsizeOptsBuf, "-Xmx");

    property_get("dalvik.vm.heapsize", heapsizeOptsBuf+4, "16m");

    opt.optionString = heapsizeOptsBuf;

    mOptions.add(opt);

 

    strcpy(heapgrowthlimitOptsBuf, "-XX:HeapGrowthLimit=");

    property_get("dalvik.vm.heapgrowthlimit", heapgrowthlimitOptsBuf+20, "");

    if (heapgrowthlimitOptsBuf[20] != '\0') {

        opt.optionString = heapgrowthlimitOptsBuf;

        mOptions.add(opt);

    }

 

    /*

     * 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) {

                opt.optionString = val;

                mOptions.add(opt);

            }

        }

 

        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) {

                opt.optionString = val;

                mOptions.add(opt);

            }

        }

 

        opc = strstr(dexoptFlagsBuf, "m=y");    /* register map */

        if (opc != NULL) {

            opt.optionString = "-Xgenregmap";

            mOptions.add(opt);

 

            /* turn on precise GC while we're at it */

            opt.optionString = "-Xgc:precise";

            mOptions.add(opt);

        }

    }

 

    /* enable debugging; set suspend=y to pause during VM init */

    /* use android ADB transport */

    opt.optionString =

        "-agentlib:jdwp=transport=dt_android_adb,suspend=n,server=y";

    mOptions.add(opt);

 

    LOGD("CheckJNI is %s\n", checkJni ? "ON" : "OFF");

    if (checkJni) {

        /* extended JNI checking */

        opt.optionString = "-Xcheck:jni";

        mOptions.add(opt);

 

        /* set a cap on JNI global references */

        opt.optionString = "-Xjnigreflimit:2000";

        mOptions.add(opt);

 

        /* with -Xcheck:jni, this provides a JNI function call trace */

        //opt.optionString = "-verbose:jni";

        //mOptions.add(opt);

    }

 

    char lockProfThresholdBuf[sizeof("-Xlockprofthreshold:") + sizeof(propBuf)];

    property_get("dalvik.vm.lockprof.threshold", propBuf, "");

    if (strlen(propBuf) > 0) {

      strcpy(lockProfThresholdBuf, "-Xlockprofthreshold:");

      strcat(lockProfThresholdBuf, propBuf);

      opt.optionString = lockProfThresholdBuf;

      mOptions.add(opt);

    }

 

#if defined(WITH_JIT)

    /* Force interpreter-only mode for selected opcodes. Eg "1-0a,3c,f1-ff" */

    char jitOpBuf[sizeof("-Xjitop:") + PROPERTY_VALUE_MAX];

    property_get("dalvik.vm.jit.op", propBuf, "");

    if (strlen(propBuf) > 0) {

        strcpy(jitOpBuf, "-Xjitop:");

        strcat(jitOpBuf, propBuf);

        opt.optionString = jitOpBuf;

        mOptions.add(opt);

    }

 

    /* Force interpreter-only mode for selected methods */

    char jitMethodBuf[sizeof("-Xjitmethod:") + PROPERTY_VALUE_MAX];

    property_get("dalvik.vm.jit.method", propBuf, "");

    if (strlen(propBuf) > 0) {

        strcpy(jitMethodBuf, "-Xjitmethod:");

        strcat(jitMethodBuf, propBuf);

        opt.optionString = jitMethodBuf;

        mOptions.add(opt);

    }

#endif

 

    if (executionMode == kEMIntPortable) {

        opt.optionString = "-Xint:portable";

        mOptions.add(opt);

    } else if (executionMode == kEMIntFast) {

        opt.optionString = "-Xint:fast";

        mOptions.add(opt);

#if defined(WITH_JIT)

    } else if (executionMode == kEMJitCompiler) {

        opt.optionString = "-Xint:jit";

        mOptions.add(opt);

#endif

    }

 

    if (checkDexSum) {

        /* perform additional DEX checksum tests */

        opt.optionString = "-Xcheckdexsum";

        mOptions.add(opt);

    }

 

    if (logStdio) {

        /* convert stdout/stderr to log messages */

        opt.optionString = "-Xlog-stdio";

        mOptions.add(opt);

    }

 

    if (enableAssertBuf[4] != '\0') {

        /* accept "all" to mean "all classes and packages" */

        if (strcmp(enableAssertBuf+4, "all") == 0)

            enableAssertBuf[3] = '\0';

        LOGI("Assertions enabled: '%s'\n", enableAssertBuf);

        opt.optionString = enableAssertBuf;

        mOptions.add(opt);

    } else {

        LOGV("Assertions disabled\n");

    }

 

    if (jniOptsBuf[10] != '\0') {

        LOGI("JNI options: '%s'\n", jniOptsBuf);

        opt.optionString = jniOptsBuf;

        mOptions.add(opt);

    }

 

    if (stackTraceFileBuf[0] != '\0') {

        static const char* stfOptName = "-Xstacktracefile:";

 

        stackTraceFile = (char*) malloc(strlen(stfOptName) +

            strlen(stackTraceFileBuf) +1);

        strcpy(stackTraceFile, stfOptName);

        strcat(stackTraceFile, stackTraceFileBuf);

        opt.optionString = stackTraceFile;

        mOptions.add(opt);

    }

 

    /* extra options; parse this late so it overrides others */

    property_get("dalvik.vm.extra-opts", extraOptsBuf, "");

    parseExtraOpts(extraOptsBuf);

 

    /* Set the properties for locale */

    {

        char langOption[sizeof("-Duser.language=") + 3];

        char regionOption[sizeof("-Duser.region=") + 3];

        strcpy(langOption, "-Duser.language=");

        strcpy(regionOption, "-Duser.region=");

        readLocale(langOption, regionOption);

        opt.extraInfo = NULL;

        opt.optionString = langOption;

        mOptions.add(opt);

        opt.optionString = regionOption;

        mOptions.add(opt);

    }

 

    /*

     * We don't have /tmp on the device, but we often have an SD card.  Apps

     * shouldn't use this, but some test suites might want to exercise it.

     */

    opt.optionString = "-Djava.io.tmpdir=/sdcard";

    mOptions.add(opt);

 

    initArgs.version = JNI_VERSION_1_4;

    initArgs.options = mOptions.editArray();

    initArgs.nOptions = mOptions.size();

    initArgs.ignoreUnrecognized = JNI_FALSE;

 

    /*

     * Initialize the VM.

     *

     * The JavaVM* is essentially per-process, and the JNIEnv* is per-thread.

     * If this call succeeds, the VM is ready, and we can start issuing

     * JNI calls.

     */

    if (JNI_CreateJavaVM(pJavaVM, pEnv, &initArgs) < 0) {

        LOGE("JNI_CreateJavaVM failed\n");

        goto bail;

    }

 

    result = 0;

 

bail:

    free(stackTraceFile);

    return result;

}


分享到:
评论

相关推荐

    Android日历+记事本源码

    【Android日历+记事本源码】是一个项目,它结合了日历应用与记事本功能,旨在为用户提供一个方便的日程管理平台。开发者通过自定义实现,将日历功能与记事本功能集成在一起,使用户可以更加便捷地记录和查看日常事务...

    Android计算器(开发笔记+源码)

    本项目是一个实现基本运算和记忆存储功能的Android计算器,包含源码和开发笔记,可以帮助开发者深入理解Android应用开发的过程。 首先,我们来看Android计算器的用户界面。在Android中,UI通常使用XML布局文件来...

    物联网技能赛笔记+源码【智能空调遥控器、智能保险箱】

    在这个“物联网技能赛笔记+源码”压缩包中,我们主要会探讨以下几个核心知识点: 1. **安卓端开发**:Android是一种基于Linux的开源操作系统,广泛应用于智能手机和平板电脑。在物联网场景下,安卓端通常作为用户...

    51CTO下载-【android资料免豆下载】汇总大量教程+工具+源码下载地址.pdf

    14. 下搭建 Android 原生 C/C++ 开发环境:涵盖了 Android 原生 C/C++ 开发环境的搭建和使用。 15. Android :ListView 详解:涵盖了 ListView 的使用和原理,包括 ListView 的优化、自定义、Adapter 等。 16. 3G ...

    iphone挂Q源码+源码+模块

    1. 主要源码文件:这些可能是用Objective-C或Swift编写的,实现了在iOS设备上维持QQ在线的主要逻辑。 2. 安卓源码:这部分可能包含Java或Kotlin代码,用于处理Android系统的兼容性和特定功能。 3. 模块:可能包括...

    android源码开发实战11.11.zip

    1. **Android系统架构**:Android系统由多个层次构成,包括Linux内核、硬件抽象层(HAL)、库层、应用程序框架层以及应用程序层。了解这些层次之间的交互是源码开发的基础。 2. **Linux内核**:作为Android的基础,...

    android 随手记源码.rar

    本项目名为"android 随手记源码.rar",是一个基于Android平台的笔记应用的源代码。该应用旨在帮助用户快速记录生活、工作中的点滴,提供便捷的记事功能。通过对源码的分析,我们可以深入理解Android应用开发的相关...

    Android驱动开发笔记

    ### Android驱动开发笔记概览 #### 1. JDK环境配置 在Android驱动开发过程中,通常需要一个良好的开发环境来支持项目的进行。文档中的片段显示了如何设置JDK(Java Development Kit)环境变量。这部分内容涉及到的...

    Android 工程师成长之路:JAVA算法的实现,数据结构 和 Android源码笔记等 分享.zip

    这份名为"Android工程师成长之路:JAVA算法的实现,数据结构 和 Android源码笔记等 分享.zip"的资源包,显然是为了帮助开发者提升在这些领域的专业技能。以下是基于这个主题的详细知识点讲解: 1. **JAVA算法实现**...

    android 移植到freescale笔记

    1. **获取内核**:首先需要基于Linux 2.6.27的Android内核源码,以及Freescale 37.8内核patch。 2. **创建补丁**:对比Android 2.6.27内核与标准2.6.27内核的差异,生成patch文件。 3. **打补丁**:将生成的补丁应用...

    Android系统-源码阅读-系统启动流程笔记

    - **Flow**:在`service_manager.c`中,ServiceManager的主要任务是注册和管理Android系统服务,而`main_runtime.cpp`则涉及SystemServer的运行时行为。 4. **ADBD**: - ADBD是Android Debug Bridge的守护进程,...

    AndroidStudio中使用NDK编译器笔记

    这篇笔记主要介绍了如何在Android Studio中配置和使用NDK进行编译。下面我们将深入探讨这个主题。 首先,我们来理解NDK的基本概念。NDK提供了一个平台,让开发者可以在不依赖Java虚拟机的情况下,直接使用原生代码...

    小米便签Android源码Notes

    《小米便签Android源码深度解析》 小米便签,作为一款广受欢迎的手机应用,其在Android平台上的实现方式一直是许多开发者关注的焦点。通过分析小米便签的Android源码,我们可以深入理解Android应用程序的设计原理,...

    Android开发教程笔记

    ### Android开发教程笔记 #### 一、Android编程基础概述 Android是一种基于Linux内核的开源移动设备操作系统,由Google在2005年收购的一家名为Android Inc.的小型创业公司发展而来。自2007年11月5日发布以来,...

    基于stm32 nucleo-L476的智能灯(操作说明+源码).zip

    该开发板内置了L476RG芯片,拥有高达80MHz的工作频率,128KB闪存和32KB SRAM,支持浮点运算单元(FPU),以及各种外设接口如USART、SPI、I2C、CAN、USB等。此外,它还配备了Arduino Uno V3和ST morpho扩展接口,方便...

    android应用源码仿小米便签.zip源码资源下载

    本篇文章将深入探讨"android应用源码仿小米便签"这一开源项目,旨在解析其核心设计理念、技术栈以及实现细节,帮助开发者们更好地理解和构建自己的Android笔记应用。 首先,我们要明确的是,这个项目是基于Android...

    android应用源码仿小米便签.zip

    1. **Activity和Fragment的使用**:在Android应用中,Activity是用户界面的主要组件,而Fragment则允许我们在一个Activity中展示多个界面或模块。源码可能会展示如何创建和管理这些组件,以及它们之间的通信机制。 ...

    A33Android4.4 rtl8723ds驱动源码

    1. **硬件接口识别**:首先,需要理解全志A33处理器与rtl8723ds之间的物理连接,包括GPIO(通用输入/输出)、SPI(串行外围接口)或I2C(Inter-Integrated Circuit)等通信协议。了解这些接口的具体定义和操作方式,...

    Android代码-饭否客户端源码.zip

    《深入解析Android饭否客户端源码》 饭否客户端源码是Android开发中一个重要的学习资源,它为我们提供了深入了解Android应用程序设计与实现的窗口。在这个源码中,我们可以看到一个完整的社交应用是如何从无到有,...

    android源码开发实战9.04.zip

    1. **Android系统架构**:Android是一个分层的系统,由Linux内核、硬件抽象层(HAL)、系统库、应用程序框架和应用程序五大部分组成。了解这些层次间的交互是Android源码开发的基础。 2. **Linux内核**:作为...

Global site tag (gtag.js) - Google Analytics