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

相关推荐
hetao17338372 分钟前
2026-09-17 hetao1733837 的刷题记录
c++·算法
西峰u1 小时前
Java单例模式|从基础到多线程安全
java·java单例模式
ClinicTech1 小时前
实验室洗瓶机的清洗系统架构与自动化控制解析
java·python
shada1 小时前
Boost.Process v2 在旧内核上报 `assign: Bad file descriptor`
c++
linmengmeng_13141 小时前
【总结】MyBatis-Plus批量插入与清表的正确姿势
java·spring boot·mysql·mybatis
木井巳1 小时前
【记忆化搜索】不同路径
java·算法·leetcode·深度优先·剪枝·推荐算法
Sam_Deep_Thinking1 小时前
new Thread()之后发生了什么?
java·后端·面试·程序员
泡海椒1 小时前
规则引擎对比:JQuick-Java vs Drools 轻量场景选型对比
java·开发语言
wno7042 小时前
Spring Security短信验证码登录
java·python·spring
别动我齐刘海2 小时前
ROS2 Jazzy + C++ 实战路线——基础学习2
c++·人工智能·vscode·python·学习·机器学习·机器人