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

相关推荐
Kapaseker11 分钟前
删掉 1.1 万行 C 代码,Rust 正式接手 Android Binder
android·rust
全栈陈序员14 分钟前
【Python】基础语法入门(三十三)—— 日志系统详解:用 logging 记录程序运行
java·开发语言·python
她的男孩23 分钟前
低代码加字段后表结构怎么同步:预览安全 DDL,高风险变更再强制执行
java·spring boot·低代码
嵌入式-老费28 分钟前
esp32开发与应用(题外话之ADB和Android NDK开发)
android·adb
简简单单就是我_hehe29 分钟前
一次 ClickHouse 服务器磁盘告警的排查与修复实录
java·服务器·前端
野生的码农32 分钟前
能工智人,40 大寿,尚能班否?
android·ai编程
Thomas.Sir33 分钟前
第11课:文件上传下载、跨域CORS配置,SpringBoot4.x跨域新方案
java·spring boot
事圆则缓38 分钟前
Android 串口通信:从 /dev/ttyS1到协议帧
android
小菜要扣篮38 分钟前
Ubuntu 下使用 vscode 打开 C++ 项目后,无法通过 F12 定位到定义问题解决
c++·vscode·ubuntu
wuminyu39 分钟前
JVM规范学习总结:class执行性能差异
java·linux·c语言·jvm·c++