Si dentro de cualquier programa de C o C++, que desea cargar y poner en las clases de DEX, se puede ver cómo se inicia la máquina virtual Dalvik, dentro del Android Runtime - por ejemplo, marcos/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;
}
como "JR" Android Runtime ya se ha iniciado, callMain() se llamará:
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;
}
De lo anterior, podemos ver cómo se cargan los códigos de las clases de DEX y CallStaticVoidMe thod() comenzará a interpretar los códigos DEX.
Gracias por su respuesta. ¿Hay algo que me impida escribir mi propio generador de código en este momento? He escrito uno para .Net-> Flash y .Net ->. Net, y Dex es como un cruce entre los archivos Java .Class y Flash .ABC. Además, gracias por el enlace. Lo destaqué y agregué un comentario (solicitando que su API sea similar al DLR de .Net). –
Definitivamente podría escribir su propio generador de código en este momento. ¡Si le das una licencia de Apache, aún mejor! –
Actualización: eche un vistazo a dexmaker, que lo hace fácil: http://code.google.com/p/dexmaker/ –