Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在运行的Dalvik/Android应用程序中动态生成Dalvik字节码_Android_Dalvik - Fatal编程技术网

在运行的Dalvik/Android应用程序中动态生成Dalvik字节码

在运行的Dalvik/Android应用程序中动态生成Dalvik字节码,android,dalvik,Android,Dalvik,关于在运行时动态生成java字节码并将其加载到运行中的Dalvik VM中,这个问题已经被问过(并得到了回答)很多次了,但是有没有办法在运行时将dex文件/字节码加载到应用程序中呢 谢谢 有没有办法加载dex 将文件/字节码输入到 运行时间 看看和。Dalvik团队希望构建一个一流的运行时代码生成库。我们正在跟踪功能请求。不幸的是,我们有一个非常长的性能和正确性问题列表,所以我不能给你一个时间表,我们将在这个问题上花费时间 有一些替代方案,但它们都需要一些工作: 在标准JVM上运行应用程序,并

关于在运行时动态生成java字节码并将其加载到运行中的Dalvik VM中,这个问题已经被问过(并得到了回答)很多次了,但是有没有办法在运行时将dex文件/字节码加载到应用程序中呢

谢谢

有没有办法加载dex 将文件/字节码输入到 运行时间


看看和。

Dalvik团队希望构建一个一流的运行时代码生成库。我们正在跟踪功能请求。不幸的是,我们有一个非常长的性能和正确性问题列表,所以我不能给你一个时间表,我们将在这个问题上花费时间

有一些替代方案,但它们都需要一些工作:

  • 在标准JVM上运行应用程序,并在那里执行所有运行时代码生成。将.class文件从内存转储到文件,然后对这些文件运行dx。如果您非常成熟,您可以将所有这些工作集成到构建中

  • 将开源dx工具作为一个项目库,并从应用程序中以编程方式执行它,可能在应用程序的类加载器中执行。这将使应用程序的二进制文件膨胀


如果在任何C或C++程序中,你想加载和调用DEX类,你可以看到Dalvik VM是如何启动的,在ANDROIDRunTime-例如框架/Base/CMDS/AppHyp/AppMy.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;
}
由于“jr”AndroidRuntime已启动,将调用callMain():

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;
}
status\u t AndroidRuntime::callMain(
常量字符*类名,整数argc,常量字符*常量argv[]
{
JNIEnv*env;
jclass-clazz;
jmethodID;
LOGD(“调用主条目%s”,类名称);
env=getJNIEnv();
if(env==NULL)
返回未知错误;
clazz=findClass(env,className);
if(clazz==NULL){
LOGE(“错误:找不到类'%s'\n',className”);
返回未知错误;
}
methodId=env->GetStaticMethodID(clazz,“main”,“([Ljava/lang/String;)V”);
if(methodId==NULL){
LOGE(“错误:找不到方法%s.main(字符串[])\n”,类名);
返回未知错误;
}
env->CallStaticVoidMethod(clazz、methodId、strArray);
返回无错误;
}

从上面,我们可以看到如何加载DEX类的代码,CallStaticVoidMethod()将开始解释DEX代码。

我使用ASM和BCEL生成Java类,然后将它们转换为DEX文件。 最后,我创建了jar文件,以便在设备上动态加载

您可以查看我的代码:)


建议动态Dalvik字节码生成。

之前的主题:谢谢你的回答。有什么东西阻止我现在编写自己的代码生成器吗?我已经为.Net->Flash和.Net->.Net编写了一个,而Dex就像是Java.Class和Flash.ABC文件的交叉点。另外,谢谢你的链接。我在t并添加了一条注释(要求它的API类似于.Net的DLR)。你现在肯定可以编写自己的代码生成器。如果你给它一个Apache许可证,那就更好了!更新:看看dexmaker,这让事情变得简单:现在Android正在转向ART,这样一个库发布的机会有多大?新的执行模型是否可能?请看这个相关问题: