Si l'intérieur de tout C ou C++ programme, vous voulez charger et appeler dans les classes de DEX, vous pouvez voir comment la machine virtuelle Dalvik est démarré, à l'intérieur du AndroidRuntime - par exemple des cadres/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;
}
Comme "jr" AndroidRuntime est déjà commencé, callMain() sera appelé:
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;
}
d'en haut, on peut voir comment sont chargés les codes des classes DEX et CallStaticVoidMe thod() commencera à interpréter les codes DEX.
Merci pour votre réponse. Y a-t-il quelque chose qui m'empêche d'écrire mon propre générateur de code maintenant? J'en ai écrit un pour .Net-> Flash et .Net ->. Net, et Dex est comme un croisement entre Java .Class et les fichiers Flash .ABC. Aussi, merci pour le lien. Je l'ai joué et ajouté un commentaire (demandant que son API soit similaire au DLR de .Net). –
Vous pouvez certainement écrire votre propre générateur de code dès maintenant. Si vous lui donnez une licence Apache, encore mieux! –
Mise à jour: jetez un oeil à dexmaker qui rend cela facile: http://code.google.com/p/dexmaker/ –