c++ 、java 融为一体2,c++ 实例化Android虚拟机直接运行java,c,java 一个进程号

接上一篇:创作中心-CSDN

直接上代码【

cpp 复制代码
/*
 * Main entry of app process.
 * Starts the interpreted runtime, then starts up the application.
 *
 */

#define LOG_TAG "app2"

#include <stdio.h>
#include <stdlib.h>
#include <sys/prctl.h>
#include <sys/stat.h>
#include <unistd.h>

#include <binder/IPCThreadState.h>
#include <hwbinder/IPCThreadState.h>
#include <utils/Log.h>
#include <cutils/memory.h>
#include <cutils/properties.h>
#include <cutils/trace.h>
#include <android-base/macros.h>
#include <android_runtime/AndroidRuntime.h>
#include <private/android_filesystem_config.h>  // for AID_SYSTEM
#include <utils/CallStack.h>
#include <jni.h>
#include <nativehelper/JniInvocation.h>

using namespace android;

namespace android {

class PppRuntime : public AndroidRuntime
{
public:
    PppRuntime(char* argBlockStart, const size_t argBlockLength)
        : AndroidRuntime(argBlockStart, argBlockLength)
        , mClass(NULL)
    {
    }

    void setClassNameAndArgs(const String8& className, int argc, char * const *argv) {
ALOGE("app_main.cpp +42  setClassNameAndArgs -------  start className=%s argc=%d ", className.c_str(), argc); // 42
        mClassName = className;
        for (int i = 0; i < argc; ++i) {
             mArgs.add(String8(argv[i]));
        }
ALOGE("app_main.cpp +47  setClassNameAndArgs -------  end"); // 46
    }

    virtual void onVmCreated(JNIEnv* env)
    {
ALOGE("app_main.cpp +52  onVmCreated -------  start env=%p ", env); // 50
        if (mClassName.empty()) {
ALOGE("app_main.cpp +54  onVmCreated -------  ifelse return;"); // 51
            return;
        }

        char* slashClassName = toSlashClassName(mClassName.c_str());
        mClass = env->FindClass(slashClassName);
        if (mClass == NULL) {
ALOGE("app_main.cpp +61  onVmCreated -------  ifelse ALOGE(ERROR: c ___ sName.c_str());"); // 57
            ALOGE("ERROR: could not find class '%s'\n", mClassName.c_str());
        }
        free(slashClassName);

        mClass = reinterpret_cast<jclass>(env->NewGlobalRef(mClass));
ALOGE("app_main.cpp +67  onVmCreated -------  end"); // 62
    }

    virtual void onStarted()
    {
ALOGE("app_main.cpp +72  onStarted -------  start "); // 66
        sp<ProcessState> proc = ProcessState::self();
        ALOGD("ppp: starting thread pool.\n");
        proc->startThreadPool();

        AndroidRuntime* ar = AndroidRuntime::getRuntime();
        ar->callMain(mClassName, mClass, mArgs);

        IPCThreadState::self()->stopProcess();
        hardware::IPCThreadState::self()->stopProcess();
ALOGE("app_main.cpp +82  onStarted -------  end"); // 75
    }

    virtual void onExit(int code)
    {
ALOGE("app_main.cpp +87  onExit -------  start code=%d ", code); // 79
        AndroidRuntime::onExit(code);
ALOGE("app_main.cpp +89  onExit -------  end"); // 80
    }

    String8 mClassName;
    Vector<String8> mArgs;
    jclass mClass;
};

}

using namespace android;

static size_t computeArgBlockSize(int argc, char* const argv[]) {
ALOGE("app_main.cpp +102  computeArgBlockSize -------  start argc=%d argv=%s ", argc, argv); // 92
    uintptr_t start = reinterpret_cast<uintptr_t>(argv[0]);
    uintptr_t end = reinterpret_cast<uintptr_t>(argv[argc - 1]);
    end += strlen(argv[argc - 1]) + 1;
ALOGE("app_main.cpp +106  computeArgBlockSize ------- return (end - start);"); // 95
    return (end - start);
}

static void maybeCreateDalvikCache() {
ALOGE("app_main.cpp +111  maybeCreateDalvikCache -------  start "); // 99
    const char* androidRoot = getenv("ANDROID_DATA");
    if (androidRoot == NULL) {
ALOGE("app_main.cpp +114  maybeCreateDalvikCache -------  ifelse return;"); // 101
        return;
    }

    char dalvikCacheDir[PATH_MAX];
    const int numChars = snprintf(dalvikCacheDir, PATH_MAX,
            "%s/dalvik-cache/", ABI_STRING, androidRoot);
    if (numChars >= PATH_MAX || numChars < 0) {
ALOGE("app_main.cpp +122  maybeCreateDalvikCache -------  ifelse return;"); // 108
        return;
    }

    int result = mkdir(dalvikCacheDir, 0711);
    if (result < 0 && errno != EEXIST) {
ALOGE("app_main.cpp +128  maybeCreateDalvikCache -------  ifelse return;"); // 113
        return;
    }

    chown(dalvikCacheDir, AID_ROOT, AID_ROOT);
    chmod(dalvikCacheDir, 0711);
ALOGE("app_main.cpp +134  maybeCreateDalvikCache -------  end"); // 118
}

int main(int argc, char* const argv[])
{
ALOGE("app_main.cpp +139  main -------  start argc=%d argv=%s ", argc, argv); // 122
    if (!LOG_NDEBUG) {
ALOGE("app_main.cpp +141  main -------  ifelse String8 argv_String;"); // 123
      String8 argv_String;
      for (int i = 0; i < argc; ++i) {
        argv_String.append("\"");
        argv_String.append(argv[i]);
        argv_String.append("\" ");
      }
      ALOGV("ppp main with argv: %s", argv_String.c_str());
    }

    maybeCreateDalvikCache();

    // Hardcode the entry class and classpath, so the tool can be launched simply as "ppp [args]".
    setenv("CLASSPATH", "/system/framework/bm.jar", 1);

    PppRuntime runtime(argv[0], computeArgBlockSize(argc, argv));
    // ignore argv[0]
    argc--;
    argv++;

    Vector<String8> options;

    // Everything up to the first non '-' arg goes to the vm as options.
    int i;
    for (i = 0; i < argc; i++) {
        if (argv[i][0] != '-') {
ALOGE("app_main.cpp +167  main -------  ifelse break;"); // 148
            break;
        }
        if (argv[i][1] == '-' && argv[i][2] == 0) {
ALOGE("app_main.cpp +171  main -------  ifelse ++i; // Skip --."); // 151
            ++i; // Skip --.
ALOGE("app_main.cpp +173  main ------- break;"); // 152
            break;
        }
        runtime.addOption(strdup(argv[i]));
    }

    String8 className("com.android.commands.bm.Bm");

    Vector<String8> args;
    args.add(String8("tool"));
    runtime.setClassNameAndArgs(className, argc - i, argv + i);

    runtime.start(className.c_str(), args, false /*zygote*/);

ALOGE("app_main.cpp +187  main ------- return 0;"); // 165
    return 0;
}

直接实例化AndroidRuntime对象,

好处之一是其调用的java代码可以直接使用所有Android层面的java api。

题外话:里面 的日志是使用自动加日志的工具添加的。比较方便不用手动加,对加日志定位问题较友好。https://gitee.com/peiqingzhen/addlog

相关推荐
jimy121 分钟前
std::move(a)本质是把a转换成右值引用类型
开发语言·c++
2601_9620566021 分钟前
Spring Boot——日志介绍和配置
java·数据库·spring boot
Alan CGH24 分钟前
一次非寻常的压测优化经历
java·网络·压力测试
01_ice25 分钟前
c++类和对象(中)
c++·算法
码匠许师傅30 分钟前
【设计模式精讲】4.单例模式(Singleton)
c++·单例模式·设计模式
IT毕设实战小研34 分钟前
基于安卓的考研资讯系统设计与实现
android·大数据·vue.js·爬虫·python·考研·课程设计
2601_9620662337 分钟前
SpringBoot3 快速启动框架
java·spring boot·后端
wind1003238 分钟前
VC++ 运行库 vcredist 安装失败|CLR 80131522 报错完整修复
开发语言·c++·游戏
远离UE41 小时前
UE5 shader instructions
java·开发语言