一个项目打包输出为一个A.jar包,其中包含资源。在另一个项目B中引用该jar,但是代码中不能直接使用A.jar里面的资源,比如直接使用A.R....中的资源id会找不到该资源。但是我们可以直接使用Android.jar中的资源id,比如android.R.string.VideoView_error_button等可以代码中直接使用。
不知道android.jar是如何做到的?

解决方案 »

  1.   

    Android.jar中的资源id号是固定的,所以引用时不会说资源找不到
    而我们的资源id每编译一次,都重新产生个id号
      

  2.   

    用rar打开jar包看看你引用的包名有没有写错
      

  3.   

    应该和这个没关系。打成jar包后,jar包里面的资源id就是固定的了。我最近刚转到android,研究android下组件开发的遇到这个问题。通过打包成jar实现组件,但是一般都要求jar中不能包含资源。但是Android.jar里面就包含有资源,并且能够直接通过id引用。如果我们的自己的组件能够做到,那自己开发android组件就不会受到种种限制。
      

  4.   

    一般的应用资源打包后不放在*.jar中,
    在*.dex中只是有R.java的R.class,
    实际的资源是不在*.jar或者*.dex中。
    资源和*.dex一起打包才成为*.apk。
    所以*.jar中,是不能引用到实际的资源的。
    这里的详细介绍可以参看sdk中关于android程序的build部分。另,一般除了类似framework的android.jar这样的公共包外,不建议去引用别的包的资源。从程序的封装性和耦合性就可以看出这点了。
      

  5.   

    打包的时候是把资源都打包到jar中的,但不能通过id直接引用。
    这里只是讨论为什么android.jar可以做到,而我们自己开发的jar不能做到,不涉及程序封装性的问题,并且资源也可能是被共享使用的。
    其实更普遍的问题是,jar包中包含有Activity,但是Activity中直接使用资源id的代码会出错,比如,setContentView(R.layout.main);
    希望能够找到更好的办法来解决类似的问题。
      

  6.   

    我这边是吧资源都删掉了,直接打出来jar包,然后把资源的文件都覆盖先程序里的资源,当然,最好你资源带前缀~
      

  7.   

    前段时间忙着干活,也没进一步研究。
    目前看来此问题难以解决。
    猜测JVM启动时就加载了Android.jar中所有类,同时装载了其中的资源。但是用户的jar被加载时,不会自动装载资源,所以只有系统jar包中的资源能够使用。
    似乎应该是有办法解决的,留待以后有时间研究下源码。
      

  8.   

    此问题结贴。
    参见 http://blog.csdn.net/yy4040/article/details/6641688
      

  9.   

    Android.jar之所以可以,我看了一下,它引用的id是@id,而不是@+id,所有的id都写在ids.xml里面,这个文件在模拟器里面也有,所以我估计每个手机平台下面也会有这个。
      

  10.   

    ids.xml文件在模拟器什么位置,谢谢!
      

  11.   

    用到public.xml.所id写这里边.编辑时候就能找到.
      

  12.   

    我感觉android.jar之所以能使用自己的资源,是因为android.jar并不和apk跑在一个层级上,他先于所有的apk被系统部署使用,实际上应该是Linix与Java之间的中间层。是承托所有apk的托盘