☰
c++ 、java 融为一体2,c++ 实例化Android虚拟机直接运行java,c,java 一个进程号
2026/10/15 21:15:45 网站建设 项目流程

接上一篇:创作中心-CSDN (c++ 、java 融为一体,c++ 实例化jvm虚拟机直接运行java),java部分代码能运行使用 open jdk 部分所有api, 但是对Android 而已,仅仅使用 jdk 部分的api是 远远不够的。

本篇 直接介绍 在c++ 层面 实例化Android虚拟机,而不是jvm虚拟机,这样java部分不仅仅可以使用jdk 部分的api, 还可以使用Android 层面封装的所有 java api .让我们直接在命令行就可以直接运行调试java代码,而不是必须跑apk. 相对方便快捷。

如我们命令行直接运行调试c c++ 一样简单快捷。

直接上代码【

/* * 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// 继承Androidruntime 类,该类运行时默认加载android java 层面所有java api库 { 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[])// c ++ 主函数 { 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);// 设置java代码库路径到环境变量 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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询