行业资讯
📅 2026/8/31 16:02:45
c++ 、java 融为一体2,c++ 实例化Android虚拟机直接运行java,c,java 一个进程号
接上一篇创作中心-CSDN c 、java 融为一体c 实例化jvm虚拟机直接运行javajava部分代码能运行使用 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_castjclass(env-NewGlobalRef(mClass)); ALOGE(app_main.cpp 67 onVmCreated ------- end); // 62 } virtual void onStarted() { ALOGE(app_main.cpp 72 onStarted ------- start ); // 66 spProcessState 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; VectorString8 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_castuintptr_t(argv[0]); uintptr_t end reinterpret_castuintptr_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; VectorString8 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); VectorString8 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