首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在smali中没有java导入?

在smali中没有java导入?
EN

Stack Overflow用户
提问于 2013-03-17 17:26:20
回答 2查看 2.3K关注 0票数 1

我今天在android源码上做了一些实验。

让我完整地说明一下,我从android源码编译了framework.jar,然后反编译,生成了smali源码,然后把它放在一边。然后从CyanogenMod repo中,我将一个特性的提交添加到android源代码中,并一次又一次地编译framework.jar,反编译smali源代码,以查看smali方面的变化,以便我可以将它们移植到我的只读存储器中。

我正在移植的功能需要导入某些类,例如导入dalvik.system.VMRuntime和额外的编码,以便利用这些导入的类。所以现在我的问题是,我只能看到额外的编码,即在smali代码中那些类的利用,而不是那些导入。因此,当我只移植小代码时,我在logcat中得到了java.lang.NoSuchMethodError,这表明它无法找到该方法。原因很清楚,因为没有导入必要的类,那么如何在smali代码中导入呢?我认为在smali中没有办法做到这一点,因此新引入的方法不起作用。

对此有什么可行的解决方案吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-18 03:14:51

在java中,导入所做的唯一一件事就是创建它,这样您就可以在不指定完整的包名的情况下引用一个类。在smali中,没有导入-所有内容都使用包含包的完全限定的类名。

因此,您的问题肯定与导入无关。这听起来像是你试图使用一种设备上根本不存在的方法。

您可以从设备中拆卸框架jars,找到dalvik.system.VMRuntime的定义,并查看可用的方法。或者添加一些反射调用,并将信息记录到logcat中。

值得注意的是,VMRuntime不是公共API的一部分,它可能不会在所有设备或未来的安卓版本上都存在或保持一致。

票数 6
EN

Stack Overflow用户

发布于 2013-03-17 21:44:02

(我不知道smali,所以可能有更好的解决方案)

任何Java程序都不需要任何import语句。例如,要使用ArrayList,您需要导入它或以java.util.ArrayList的形式完整引用它。

例如,在Java和C++导入之间有很大的区别。C++ #include直接在您的程序中插入代码,通常是您正在使用的类的声明。在Java中,获取声明的过程分为两个阶段。首先,编译器确定完全限定的类名,然后使用它自己的库和类路径来查找该名称的声明。Java import仅用于计算完全限定的类名,因此对于仅由其完全限定名引用的任何类都不需要。

也许你可以对你添加的代码进行预处理,例如用dalvik.system.VMRuntime替换VMRuntime,这样你就可以编译它而不需要导入。

下面是一个简短的程序示例,它以不同的方式使用java.util类,而不需要任何导入:

代码语言:javascript
复制
public class Test {
  public static void main(String[] args) {
    java.util.List<String> list = new java.util.ArrayList<String>();
    list.add("bbb");
    list.add("aaa");
    java.util.Collections.sort(list);
    System.out.println(list);
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15459256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档