修改jar中的类:android build失败

时间:2015-08-13 19:13:28

标签: java android jar

我想更改cordova的Barcode Scanner插件的jar文件中的内容,即RESULT_DISPLAY_DURATION_MS中的CaptureActivity class

我使用终端解压缩它(我在Mac上)。

然后,使用ClassEditor,我查找了类CaptureActivity,并更改了值。 接下来,我使用jar cfv samenameasoriginal.jar *重新存档它。 然后,我替换了原来的jar文件。

问题是,当我尝试使用离子构建它时,我得到一长串错误,包含:

  

意外的顶级例外情况:   com.android.dx.cf.iface.ParseException:错误的属性长度;预期   长度00000002 ......解析时   COM /谷歌/斑马线/客户端/机器人/ CaptureActivity.class

我注意到新的jar文件比原来的大7 kb,虽然我只将1500改为9500,所以这有点奇怪。

任何可以帮助我的人?在线查看但没有发现......

3 个答案:

答案 0 :(得分:1)

从类中扩展并调整值:

public class CustomCaptureActivity extends CaptureActivity {

    RESULT_DISPLAY_DURATION_MS = 9500; // wheras 9500 is your custom value
}

而不是调用CaptureActivity现在用户自定义类。

如果RESULT_DISPLAY_DURATION_MS是只读的:复制&将使用此变量的方法粘贴到您的自定义类,并使用您自己的类中定义的新常量替换该变量。只要CaptureActivity不是final,这对你来说就好了。

答案 1 :(得分:1)

我认为问题是因为在创建JAR时,有一些链接可能与文件的旧版本有关(由于选择原因)而且一切都崩溃了。

不确定,但我认为这就是原因。

因此,您可以使用或者使用Decorator设计模式(更好的想法,如果可能的话)继承您需要根据更改(https://en.wikipedia.org/wiki/Decorator_pattern)更改的类,或者您可以使用反射来代替更改文件直接修改库。

这里有一个如何更改私人最终字段的示例。你可以做类似的事情:

import java.lang.reflect.*;

public class EverythingIsTrue {
     static void setFinalStatic(Field field, Object newValue) throws Exception {
         field.setAccessible(true);

         Field modifiersField = Field.class.getDeclaredField("modifiers");
         modifiersField.setAccessible(true);
         modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);

         field.set(null, newValue);
     }

     public static void main(String args[]) throws Exception {      
         setFinalStatic(Boolean.class.getField("FALSE"), true);

         System.out.format("Everything is %s", false); // "Everything is true"
     }
}

答案 2 :(得分:0)

正确的答案是,你的一些jar文件无法编译。您应该进入项目中的构建路径(设置所有相关路径)文件,并查看依赖项。

如果您只是导入一些jar文件,可以尝试删除它们并一次添加一个。这将帮助您确定哪一个导致错误。

在我的情况下,我做到了这一点,当我导入最后一个时,应用程序编译完成。所以我认为真正的问题是我一次导入的太多了。但现在一切正常。