Wenn innerhalb jeder C oder C++ Programm, Sie wollen in die DEX-Klassen laden und aufrufen, können Sie sehen, wie die Dalvik VM gestartet wird, innerhalb des Android Runtime - zum Beispiel Gerüste/base/cmds/app_process/app_main.cpp:
status_t app_init(const char* className, int argc, const char* const argv[])
{
LOGV("Entered app_init()!\n");
AndroidRuntime* jr = AndroidRuntime::getRuntime();
jr->callMain(className, argc, argv);
LOGV("Exiting app_init()!\n");
return NO_ERROR;
}
Als "jr" Android Runtime bereits gestartet ist, wird callMain() aufgerufen werden:
status_t AndroidRuntime::callMain(
const char* className, int argc, const char* const argv[])
{
JNIEnv* env;
jclass clazz;
jmethodID methodId;
LOGD("Calling main entry %s", className);
env = getJNIEnv();
if (env == NULL)
return UNKNOWN_ERROR;
clazz = findClass(env, className);
if (clazz == NULL) {
LOGE("ERROR: could not find class '%s'\n", className);
return UNKNOWN_ERROR;
}
methodId = env->GetStaticMethodID(clazz, "main", "([Ljava/lang/String;)V");
if (methodId == NULL) {
LOGE("ERROR: could not find method %s.main(String[])\n", className);
return UNKNOWN_ERROR;
}
<...>
env->CallStaticVoidMethod(clazz, methodId, strArray);
return NO_ERROR;
}
Von oben können wir sehen, wie die Codes DEX Klassen geladen und CallStaticVoidMe thod() beginnt mit der Interpretation der DEX-Codes.
Vielen Dank für Ihre Antwort. Gibt es etwas, das mich daran hindert, meinen eigenen Code-Generator zu schreiben? Ich habe einen für .Net-> Flash und .Net ->. Net geschrieben, und Dex ist wie eine Kreuzung zwischen Java .Class und Flash .ABC-Dateien. Auch, danke für den Link. Ich habe es mit einem Stern versehen und einen Kommentar hinzugefügt (er fordert, dass sein API dem DLR von .Net ähnlich ist). –
Sie könnten jetzt definitiv Ihren eigenen Code-Generator schreiben. Wenn Sie eine Apache-Lizenz geben, noch besser! –
Update: Werfen Sie einen Blick auf dexmaker, das macht das einfach: http://code.google.com/p/dexmaker/ –