Nếu bên trong bất kỳ chương trình C hoặc C++, bạn muốn tải và gọi vào các lớp DEX, bạn có thể thấy cách Dalvik VM được bắt đầu, bên trong AndroidRuntime - cho các khuôn khổ dụ/cơ sở/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;
}
Như "jr" AndroidRuntime đã được bắt đầu, callMain() sẽ được gọi là:
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;
}
Từ trên, chúng ta có thể thấy cách mã các lớp DEX được nạp và CallStaticVoidMe thod() sẽ bắt đầu diễn giải các mã DEX.
Nguồn
2011-02-09 02:39:40
Cảm ơn câu trả lời của bạn. Có điều gì ngăn tôi viết trình tạo mã của riêng tôi ngay bây giờ không? Tôi đã viết một cho. Net-> Flash và Net -> Net, và Dex giống như một chéo giữa các tệp Java .Class và Flash .ABC. Ngoài ra, cảm ơn liên kết. Tôi đã gắn dấu sao và thêm nhận xét (yêu cầu API của nó tương tự với DLR của .Net). –
Bạn chắc chắn có thể viết trình tạo mã của riêng bạn ngay bây giờ. Nếu bạn cung cấp cho nó một giấy phép Apache, thậm chí tốt hơn! –
Cập nhật: hãy xem dexmaker làm cho việc này dễ dàng: http://code.google.com/p/dexmaker/ –