【转】Android导出jar library时资源resource id获取的问题

本文介绍了解决Android项目中资源ID冲突的问题,提供了三种方法:利用反射机制获取资源ID、替换主题资源以及在Eclipse中进行工程间的依赖设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当需要把一个Android导出为jar包时,如果里面有用到Resource,比如R.layout,R.id 其它程序引入这个包的时候会遇到id找不到的情况。

这是因为导出jar的时候里面的R.id已经替换为一个int常量,而在新的程序中resource id会重新生成,两者不匹配就会产生问题。

所以在这个Android工程中不能使用import com.xx.R,否则会出现问题,必须在用到资源的时候用另外一个函数去获取它的真正id.

解决办法大致就是利用java的反射机制,通过string来找到类,从而找到变量值。

方法一

public static int getId(Context paramContext, String paramString1, String paramString2)
    {
        try
        {
            Class localClass = Class.forName(paramContext.getPackageName() + ".R$" + paramString1);
            Field localField = localClass.getField(paramString2);
            int i = Integer.parseInt(localField.get(localField.getName()).toString());
            return i;
        } catch (Exception localException)
        {
            Log.e("getIdByReflection error", localException.getMessage());
        }
 
        return 0;
    }

方法二

这个也是替换Theme的方法

   public static int getLayoutResIDByName(Context context, String name) {
       return context.getResources().getIdentifier(name, "layout",
              context.getPackageName());
    }
 
    public static int getIdResIDByName(Context context, String name) {
       return context.getResources().getIdentifier(name, "id",
              context.getPackageName());
    }
 
    public static int getStringResIDByName(Context context, String name) {
       return context.getResources().getIdentifier(name, "string",
              context.getPackageName());
    }
 
    public static int getDrawableResIDByName(Context context, String name) {
       return context.getResources().getIdentifier(name, "drawable",
              context.getPackageName());
    }
 
    public static int getRawResIDByName(Context context, String name) {
       return context.getResources().getIdentifier(name, "raw",
              context.getPackageName());
    }

方法三

Android工程间相互依赖,只适用于在Eclipse中开发

参考官方说明http://developer.android.com/guide/developing/projects/projects-eclipse.html

<think>嗯,用户这次的问题很明确,是在EclipseJavaOxygen版本中导出文件的指南需求。从引用内容看,用户已经查阅了相关资料,括反编译插件、UML工具和打方法,但特别强调需要针对Oxygen版本的导出教程。这说明用户可能遇到了版本兼容性问题,或者之前的教程步骤不匹配当前环境。用户引用的资料其实非常齐全:[^1]提到ClassDecompiler插件的安装方式,[^2]详细记载了GEF插件安装的版本选择技巧,[^3][^4]则都涉及项目打JAR的操作。不过用户特意排除了反编译和UML相关内容,专注在"导出文件"这个核心需求上。这暗示用户当前可能在处理项目部署或代码交付的场景。我注意到用户要求"尽可能多参考上次问答",但系统显示这是新对话链。因此需要把引用内容当作用户提供的背景资料。有趣的是,引用[^3][^^4]虽然都讲打,但后者脚本之家的版本重复了前者的内容,说明用户可能在不同来源交叉验证打方法——这提示我需要强调操作细节的可靠性。针对Oxygen版本的特殊性,我需要重点说明:-新式导出向导的入口位置(传统File>Export被重构过)-JavaSE项目与JavaEE项目导出选项的差异-MANIFEST.MF文件的版本兼容问题(Oxygen默认用MF1.2)还要补充用户可能忽略的细节:-ANT脚本导出方式作为备用方案-运行JAR与非执行JAR的配置区别考虑到用户引用过反编译插件,或许会需要查看导出的class文件,可以补充反编译验证步骤,但根据指令优先级,相关内容放在生成问题环节更合适。最后的注意事项里要强调.classpath文件缺失问题,因为这是Oxygen版本常见陷阱——当用户从Git克隆项目经常发生。这次不用生成代码片段(用户要的是操作流程),但需要分步骤说明,并且用加粗突出版本相关步骤。因为涉及截图描述,在无法附图的限制下要用更精准的位置描述,比如"第5层菜单"这样的表达。</think> 以下是在Eclipse Java Oxygen(4.7.0)中导出文件的完整教程,整合了引用信息并针对该版本优化操作步骤: ### 🔧 一、导出可执行JAR文件(项目打) 1. **右键项目 → `Export`** ![Export入口](eclipse-export-path.png) 2. 在对话框中: `Java` → `Runnable JAR file` → `Next` 3. 配置参数: - **`Launch configuration`**:选择含`main()`方法的启动项 - **`Export destination`**:设置JAR输出路径(如 `C:\demo.jar`) - **`Library handling`**: - 选择`Package required libraries into generated JAR`(内嵌依赖库) - 或`Extract required libraries`(分离依赖)[^3][^4] 4. 点击`Finish`,等待进度条完成 ✅ > ⚠️ **常见问题解决**: > - 若报错"no main manifest attribute":需在项目中配置`MANIFEST.MF`文件,指定`Main-Class`头[^4] > - 依赖冲突:改用`Extract required libraries`选项分离第三方库 --- ### 📦 二、导出普通JAR(非可执行) 1. `Export` → `Java` → **`JAR file`** 2. 勾选需导出资源: ![资源选择](jar-resource-selection.png) - 建议排除`bin/`, `.settings/`等编译无关目录 3. 在`JAR Manifest Specification`中: - 勾选`Generate manifest file` - 若需指定主类:`Use existing manifest`→选项目中的`MANIFEST.MF` [^3] --- ### 🔍 三、导出源代码(附加) 1. `Export` → `Java` → **`JAR file`** 2. 资源选择中:**仅勾选`src`目录** 3. 输出路径命名为`[项目名]_source.jar` > 💡 **技巧**:结合[Class Decompiler插件](http://www.blogjava.net/cnfree/archive/2012/10/30/390457.html)[^1],可直接在Eclipse查看导出JAR反编译结果 --- ### ⚙️ 四、通过ANT脚本导出(高级) > 适用于复杂打流程(需`build.xml`) 1. 右键`build.xml` → `Run As` → **`Ant Build`** 2. 在`JRE`标签页确认使用**Java 8+**(兼容Oxygen) 3. 输出日志出现`BUILD SUCCESSFUL`即完成 ✅ --- ### ❗ 注意事项(Oxygen版专有) 1. 若依赖**GEF插件**(如UML图导出): - 需通过`Help → Install New Software`安装**GEF5**: `http://download.eclipse.org/tools/gef/updates/releases` [^2] - **必须重启Eclipse生效** 2. 导出后验证: ```bash java -jar demo.jar # 运行测试 jar tvf demo.jar # 查看内容 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值