`
473687880
  • 浏览: 484252 次
文章分类
社区版块
存档分类
最新评论

[2013.9.8网络首发]导入Android4.2源码里的Gallery2和Camera模块至Eclipse全过程

 
阅读更多

google的android自带的apps写的是相当牛逼的,将其导入到eclipse中方便我们学习扩展。可惜关于导入的资料太少了,尤其是4.1之后的gallery和camera合二为一了。之前导4.0的camera那时不费吹灰之力就搞成了。下面的文字记录是我摸索了近十天终于导成功的记录,给大家分享了。

一、开发环境的搭建

1、 点击http://developer.android.com/sdk/index.html下载adt-bundle-windows-x86-20130522426M)。尽管部分机子上有非adt-bundle搭建的开发环境,但考虑到google已不支持以往android sdk + adt + Eclipse的方式,改推adt-bundle的方式,故杂家以adt-bundle-windows-x86-20130522搭建的开发环境为基础。(注:这里默认JDK已经安装配置好了。)

2、 点击http://developer.android.com/sdk/installing/installing-adt.html 选择在线或离线方式升级ADT版本为22.0.5。上面的adt-bundle自带的ADT版本是22.0.1,不支持解析rs文件,会导致后面的工作功亏一篑,因此一定要升级。如果在线安装ADT失败,考虑将C:\Windows\System32\drivers\etc\hosts文件添加一行:74.125.237.1dl-ssl.google.com 就可以正常下载安装了,包括后续的更新build-toolsSDK-toolsPlatform-tools。具体参考前文

[android开发IDE]adt-bundle-windows-x86的一个bug:无法解析.rs文件--------rs_core.rsh file not found

更新SDK-tools、Platform-tools、build-tools版本分别为22.0.5、18.0.1、18.0.1,

二、导入前的准备

1、 编译Android4.2的源码,目的是为了得到后面的四个classes文件,如果通过其他途径有这四个文件也可以不编译。4.2的源码编译需要在64位机子上。这四个文件稍后会上传到网上。

2、F:\AndroidSource4.2_r1\packages\apps下的Gallery2文件夹和Camera文件夹复制到桌面一份,后续将先导入Gallery2再导入Camera

3、 在桌面新建一个Camera4.2Need文件夹,将/out/target/commom/obj/JAVA_LIBRARIES/core_intermediates//out/target/commom/obj/JAVA_LIBRARIES/framework_intermediates//out/target/commom/obj/JAVA_LIBRARIES/mp4parser_intermediates//out/target/commom/obj/JAVA_LIBRARIES/ xmp_toolkit_intermediates这四个路径下的classes.jar文件分别重命名为core_intermediatesframework_intermediatesmp4parser_intermediatesxmp_toolkit_intermediates放到Camera4.2Need文件夹,后续这个文件夹可以放到工作空间以免丢失。

三、开始导入

1、 打开eclipse,点击File---New----Project---Android---Android Project from Existing Code,选择桌面的那个Gallery2文件夹,test不要勾选,copy projects到工作空间要勾选。

导入后会报错如下,不用管:

2、 导入后首先检查gen文件夹是否解析了rs文件,正常解析的话会生成ScriptC_convolve3x3.java文件和convolve3x3.d,如果没有生成则说明当前开发环境无法解析rs文件(com.android.gallery3d.filtershow.filters包下的convolve3x3.rs文件),需要重新配置开发环境。

3、 右击工程的属性或按alt+enter快捷键,选中Java Build Path,点击Source,选择Add Folder,将gallerycommonsrc_pd勾选上。如果这两个文件夹不勾选,后续会找不到很多类和包,而这些缺失并不是缺少.classes文件导致的。如果提示重复,就按如下步骤进行.

4、Android Dependenices文件夹下的那两个空包删除。找到源码Gallery2下的gallerycommon文件夹,需要将这里的文件按对应的包名,添加到gallerycommon文件夹下。新建gallerycommon文件夹,新建包名com.android.gallery3d.common;然后将gallerycommon文件夹下的java文件复制过去。其他的包类似。对源码里的src_pd也做同样的操作。【注:在java build path属性里,source目录下src_pcgallerycommon这两个文件夹必须勾选,否则新建的包会自动跑到src目录下。】最终得到的结果如下:

[注:这个过程比较灵活,只要最终将两个文件夹下的包导入进去即可,确保包名正确。]

5、alt+enter快捷键,选中java build path,点Libraries---Add Library,选择User Library,并将下面的那个选项勾上,表示它的级别很高。New一个Library,名字为Camera4.2Need,将刚准备的四个.jar文件添加进来。

6、 然后点Order and Export,将Camera4.2Need这个库的位置放在Android4.2.2的前面。调整后的顺序如下:

7、 点击res文件夹,点开values文件夹,可以看到里面的filtershow_strings.xmlphotoeditor_strings.xmlstrings.xml有错误,原因是里面有重复定义。将报错的地方删掉即可!每删掉一个地方,对应的另一个文件报错的地方就会恢复正常。可以按照这种方法对values-xx开头的文件夹都做相同的处理,但事实上,由于我们只要简体中文,所以只保留values-zh-rCN文件夹即可,对此文件夹的报错也作上述处理。其他的values-xx文件夹统统删掉。

8、 在导入camera文件之前需要逐一对照camera下的res文件夹和当前gallery工程下的res文件夹下的文件有无重名。如两者的values文件夹下都有atrrs.xml文件,需要将camera的那一份重命名为atrrs_camera.xml,否则会发生覆盖导致出错。导入时点击Gallery工程,注意一定是导到Gallery工程目录下。右击选择—import---General---File System,其中的.git文件夹及test文件夹、Android.mkCleanSpec.mk不要选。

9、 点击Clean,重新编译仍然会有错。WidgetTypeChooser.java报错,但实质上并不是这个文件出了问题。这也正是ADT-Bundle安装的eclipse没有自己下载的Eclipse好用的表现之一,当出现大量错误时,前者会乱报错。这时gen文件夹下com.android.gallery3d下的R文件已经生成。整个工程的错误在包com.android.camera.ui下的各个java文件中,这些java文件都导入了com.android.camera.R,但实质上和camera相关的资源ID都被整合到gen文件夹下的com.android.gallery3d.R文件中了。也即本来应该是cameraR文件整合到galleryR文件中去了,com.android.camera.R这个文件根本没有生成。因此凡是import com.android.camera.R;有这句话的地方一定会报错,奇怪的是eclipse还显示不出来。用import com.android.gallery3d.R;来代替这句话即可。

10、 在修改了com.android.camera.ui包下的各个java文件后,对com.android.camera包下的java文件也要进行修改,凡是引用了R的地方都会报错,但eclipse可能显示不出来。一定要保证com.android.camera.ui包下凡是引用R文件的地方都要导入Gallery3d.R包。

11、 在编译的时候会将错误显示到WidgetTypeChooser.java中,并在下方输出错误为:The project was not built since its build path is incomplete. Cannot find the class file for android.view.CompatibilityInfoHolder. Fix thebuild path then try building this project GalleryUnknownJava Problem。即找不到android.view.CompatibilityInfoHolder,参考http://124.16.139.131:24080/lxr/source/frameworks/base/core/java/android/view/CompatibilityInfoHolder.java?v=android-4.0.4新建包android.view,然后将新建CompatibilityInfoHolder.java[备注:在有的版本上并没有遇到这个问题,有可能是android4.2将这个类去除了。]

package android.view;

 import android.content.res.CompatibilityInfo;
 
 /** @hide */
 public class CompatibilityInfoHolder {
     private volatile CompatibilityInfo mCompatInfo = CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO;
 
     public void set(CompatibilityInfo compatInfo) {
         if (compatInfo != null && (compatInfo.isScalingRequired()
                 || !compatInfo.supportsScreen())) {
             mCompatInfo = compatInfo;
         } else {
             mCompatInfo = CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO;
         }
     }
 
     public CompatibilityInfo get() {
         return mCompatInfo;
     }
 
     public CompatibilityInfo getIfNeeded() {
         CompatibilityInfo ci = mCompatInfo;
         if (ci == null || ci  == CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO) {
             return null;
         }
         return ci;
     }
 }


12、 再次clean编译会报错:某个函数需要的api版本要大于11,当前最低版本为10.需修改AndroidManifest.xml文件,最低api版本为11,目标版本为17,因为我们的手机是4.2对应级别为17

13、 再次clean编译会报错:在ImageFilterSharpen.java函数里找不到forEach_root()函数。通过对源码编译的输出路径out进行搜索,在/out/target/common/obj/APPS/GALLERY2_intermediates/src/com/android/Gallery3d/filtershow/filters文件夹下找到ScriptC_convolve3x3.java一共可以找到3份同名的文件,只有这个路径下的代码有forEach_root(Allocation, Allocation)接口。将此文件复制出来一份,粘贴到com.android.gallery3d.filtershow.filters下,将名字改为MyScriptC_convolve3x3.java,否则会跟gen文件下的文件重名,并在类的构造函数等其他地方更改名字,包名也要改。

/*
 * Copyright (C) 2011-2012 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/*
 * This file is auto-generated. DO NOT MODIFY!
 * The source Renderscript file: packages/apps/Gallery2/src/com/ku/cameragal/filtershow/filters/convolve3x3.rs
 */
package com.android.gallery3d.filtershow.filters;

import android.renderscript.*;
import android.content.res.Resources;

/**
 * @hide
 */
public class MyScriptC_convolve3x3 extends ScriptC {
    private static final String __rs_resource_name = "convolve3x3";
    // Constructor
    public  MyScriptC_convolve3x3(RenderScript rs) {
        this(rs,
             rs.getApplicationContext().getResources(),
             rs.getApplicationContext().getResources().getIdentifier(
                 __rs_resource_name, "raw",
                 rs.getApplicationContext().getPackageName()));
    }

    public  MyScriptC_convolve3x3(RenderScript rs, Resources resources, int id) {
        super(rs, resources, id);
        __I32 = Element.I32(rs);
        __ALLOCATION = Element.ALLOCATION(rs);
        __F32 = Element.F32(rs);
        __U8_4 = Element.U8_4(rs);
    }

    private Element __ALLOCATION;
    private Element __F32;
    private Element __I32;
    private Element __U8_4;
    private FieldPacker __rs_fp_ALLOCATION;
    private FieldPacker __rs_fp_F32;
    private FieldPacker __rs_fp_I32;
    private final static int mExportVarIdx_gWidth = 0;
    private int mExportVar_gWidth;
    public synchronized void set_gWidth(int v) {
        setVar(mExportVarIdx_gWidth, v);
        mExportVar_gWidth = v;
    }

    public int get_gWidth() {
        return mExportVar_gWidth;
    }

    public Script.FieldID getFieldID_gWidth() {
        return createFieldID(mExportVarIdx_gWidth, null);
    }

    private final static int mExportVarIdx_gHeight = 1;
    private int mExportVar_gHeight;
    public synchronized void set_gHeight(int v) {
        setVar(mExportVarIdx_gHeight, v);
        mExportVar_gHeight = v;
    }

    public int get_gHeight() {
        return mExportVar_gHeight;
    }

    public Script.FieldID getFieldID_gHeight() {
        return createFieldID(mExportVarIdx_gHeight, null);
    }

    private final static int mExportVarIdx_gPixels = 2;
    private Allocation mExportVar_gPixels;
    public void bind_gPixels(Allocation v) {
        mExportVar_gPixels = v;
        if (v == null) bindAllocation(null, mExportVarIdx_gPixels);
        else bindAllocation(v, mExportVarIdx_gPixels);
    }

    public Allocation get_gPixels() {
        return mExportVar_gPixels;
    }

    private final static int mExportVarIdx_gIn = 3;
    private Allocation mExportVar_gIn;
    public synchronized void set_gIn(Allocation v) {
        setVar(mExportVarIdx_gIn, v);
        mExportVar_gIn = v;
    }

    public Allocation get_gIn() {
        return mExportVar_gIn;
    }

    public Script.FieldID getFieldID_gIn() {
        return createFieldID(mExportVarIdx_gIn, null);
    }

    private final static int mExportVarIdx_gCoeffs = 4;
    private float[] mExportVar_gCoeffs;
    public synchronized void set_gCoeffs(float[] v) {
        mExportVar_gCoeffs = v;
        FieldPacker fp = new FieldPacker(36);
        for (int ct1 = 0; ct1 < 9; ct1++) {
            fp.addF32(v[ct1]);
        }

        int []__dimArr = new int[1];
        __dimArr[0] = 9;
        setVar(mExportVarIdx_gCoeffs, fp, __F32, __dimArr);
    }

    public float[] get_gCoeffs() {
        return mExportVar_gCoeffs;
    }

    public Script.FieldID getFieldID_gCoeffs() {
        return createFieldID(mExportVarIdx_gCoeffs, null);
    }

    private final static int mExportForEachIdx_root = 0;
    public Script.KernelID getKernelID_root() {
        return createKernelID(mExportForEachIdx_root, 3, null, null);
    }

    public void forEach_root(Allocation ain, Allocation aout) {
        // check ain
        if (!ain.getType().getElement().isCompatible(__U8_4)) {
            throw new RSRuntimeException("Type mismatch with U8_4!");
        }
        // check aout
        if (!aout.getType().getElement().isCompatible(__U8_4)) {
            throw new RSRuntimeException("Type mismatch with U8_4!");
        }
        // Verify dimensions
        Type tIn = ain.getType();
        Type tOut = aout.getType();
        if ((tIn.getCount() != tOut.getCount()) ||
            (tIn.getX() != tOut.getX()) ||
            (tIn.getY() != tOut.getY()) ||
            (tIn.getZ() != tOut.getZ()) ||
            (tIn.hasFaces() != tOut.hasFaces()) ||
            (tIn.hasMipmaps() != tOut.hasMipmaps())) {
            throw new RSRuntimeException("Dimension mismatch between input and output parameters!");
        }
        forEach(mExportForEachIdx_root, ain, aout, null);
    }

}


14、ImageFilterSharpen.java中,将ScriptC_convolve3x3 mScript改为MyScriptC_convolve3x3 mScript,并在相应地方同步更改类名。

经过上述步骤,Android4.2源码Gallery2Camera模块成功导入Eclipse,并能正常编译,稍后会将编译出的apk共享出来。

欢迎android爱好者加群248217350 备注:yanzi

---------------------本文系原创,转载请注明作者:yanzi1225627

分享到:
评论

相关推荐

    自动驾驶运动规划(Motion Planning).pdf

    自动驾驶运动规划(Motion Planning)问题分析

    财务数据分析模型6.xlsx

    Excel数据看板,Excel办公模板,Excel模板下载,Excel数据统计,数据展示

    人力资源数据分析看版.xlsx

    Excel数据看板,Excel办公模板,Excel模板下载,Excel数据统计,数据展示

    重庆大学2011-2012(2)数字电子技术II.pdf

    重庆大学期末考试试卷,重大期末考试试题,试题及答案

    随波逐流CTF编码工具 V5.6 20240424.rar

    由随波逐编写开发,CTF编码工具为用户提供丰富的离线加密解密功能,还可以对字符编码进行转换,文件隐写查看,用户可以根据自己的需求来使用功能,非常实用,能够提高大家的工作效率!

    重庆大学电磁场原理08年考题(A).pdf

    重庆大学期末考试试卷,重大期末考试试题,试题及答案

    基于matlab的SUI信道模型内含数据集.zip

    基于matlab的SUI信道模型内含数据集.zip

    年执行校长岗位工作总结.docx

    工作总结,新年计划,岗位总结,工作汇报,个人总结,述职报告,范文下载,新年总结,新建计划。

    Java项目合集

    提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

    2023产业经济大脑建设方案.pptx

    2023产业经济大脑建设方案.pptx

    基于51单片机设计多功能计算器软硬件资料(包括原理图+仿真+ 软件源程序+文档资料).zip

    基于51单片机设计多功能计算器软硬件资料(包括原理图+仿真+ 软件源程序+文档资料) 本设计是以STC89C52单片机为核心的计算器模拟系统设计,输入采用5×8矩阵键盘,可以进行加、减、乘、除等十几种数字运算,同时支持括号的嵌套使用级浮点数的运算,并在LCD1602上显示操作过程。 本次设计注重设计方法及流程,首先根据原理设计电路,利用keil编程,借助实验开发平台进行仿真实验,进而利用altium designer 制作PCB,最后到焊接元器件,直至调试成功。在设计的同时,特别注重keil软件和altium designer软件的使用方法和技巧以及常用的LCD显示器和矩阵键盘的设计和使用方法。 【关键词】 计算器,STC89C52,矩阵键盘,1602液晶

    年企业个人年度工作总结.docx

    工作总结,新年计划,岗位总结,工作汇报,个人总结,述职报告,范文下载,新年总结,新建计划。

    杭电数据结构期末复习题.pdf

    杭州电子科技大学,期末考试资料,计算机专业期末考试试卷,试卷及答案,数据结构。

    weixin103基于h5移动网赚项目微信小程序+springboot后端毕业源码案例设计.zip

    提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

    C++开发的图书管理系统

    C++开发的图书管理系统

    ... data》

    提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

    FPGA工程师面试题目2020年7月份

    这是我2020年7月份在海淀参加FPGA工程师面试的题目,选择题、问答题,适用于参加FPGA工程师面试的小伙伴。这是当初我参加某个FPGA开发岗位的面试的考卷,里面有我做的答案。该试卷同样适用于FPGA学习者做能力测验。尤其适合尚未开始FPGA开发工作的小伙伴,用于提前试水,作为了解面试考题的素材之一

    采用倒频谱法来估计模糊图像的模糊角度matlab代码.zip

    1.版本:matlab2014/2019a/2021a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    营业额日报.xlsx

    Excel数据看板,Excel办公模板,Excel模板下载,Excel数据统计,数据展示

    人力资源数据分析4.xlsx

    Excel数据看板,Excel办公模板,Excel模板下载,Excel数据统计,数据展示

Global site tag (gtag.js) - Google Analytics