PS:Android Studio用AIDL时,碰到一个非常棘手的问题,但是百度之,压根非法解决,翻墙出去,终于找到了一篇解决问题的文章,特地转载之。

之前使用aidl传递的都是基本的数据类型比如int 、boolean之类的还有就是String类型的参数,并没有传递自己定义的class。 最近在开发的过程中重构代码时遇到了这个问题,网上也有文章提供了解决的办法,不过不太全面。我东拼西凑才把问题给解决了。这里记录一下。

一、直接在aidl中的方法参数传递一个自定义类参数。

看一下我们的aidl文件

// IJDMAService.aidl
package com.jingdong.jdlogsys; import com.jingdong.jdlogsys.model.CommonParamInfo; interface IJDFileLogService { void setCommonParamInfo(CommonParamInfo info);
void changeUser(String uid,String uuid,String pin); }

  

这里的setCommonParamInfo方法的参数就是一个我们自己定义的类CommonParamInfo,虽然上面import了这个类,但是编译项目时会报如下的错误信息(使用Android Studio)。

Error:Execution failed for task ':JDLogSys:compileReleaseAidl'.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'D:\Android\sdk\build-tools\19.1.0\aidl.exe'' finished with non-zero exit value 1
Error:(5) couldn't find import for class com.jingdong.jdlogsys.model.CommonParamInfo
F:\JD_GIT\JDLogSys\JDLogSys\res\com\jingdong\jdlogsys\IJDFileLogService.aidl

  

看到这么一行信息Error:(5) couldn't find import for class com.jingdong.jdlogsys.model.CommonParamInfo。意思就是找不到这个类。

二、网上提供了一个解决这个问题的方法

首先新建一个CommonParamInfo.aidl文件,文件的内容如下:

package com.jingdong.jdlogsys.model;

parcelable CommonParamInfo;

  

要注意的是这里的package要和原本定义的类的包名一样,其次是下面的parcelable CommonParamInfo;这行代码。

当然最重要的一点是你自己定义的类要实现Parcelable接口并按照规范重写一系列方法。这里我就不做介绍了。

接着重新编译,是的不再报上面那个错误信息,但是报了另外一个错误:

:JDLogSys:compileReleaseAidl
F:\JD_GIT\JDLogSys\JDLogSys\res\com\jingdong\jdlogsys\IJDFileLogService.aidl:14 parameter 1: 'CommonParamInfo info' can be an out parameter, so you must declare it as in, out or inout.
Error:Execution failed for task ':JDLogSys:compileReleaseAidl'.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'D:\Android\sdk\build-tools\19.1.0\aidl.exe'' finished with non-zero exit value 1

  

看到这么一行信息IJDFileLogService.aidl:14 parameter 1: 'CommonParamInfo info' can be an out parameter, so you must declare it as in, out or inout.

意思就是我们需要把这个参数声明成in或者inout类型的,

三、于是我们修改一下aidl中的setCommonParamInfo方法,一开始我是设置的inout:

void setCommonParamInfo(inout CommonParamInfo info);

于是,不出意外接着报错:

Error:(144, 5) 错误: 找不到符号
符号: 方法 readFromParcel(Parcel)
位置: 类型为 CommonParamInfo 的变量 info
注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。
Error:Execution failed for task ':JDLogSys:compileReleaseJava'.
> Compilation failed; see the compiler error output for details.
1 个错误
注: 某些输入文件使用或覆盖了已过时的 API。
F:\JD_GIT\JDLogSys\JDLogSys\build\generated\source\aidl\release\com\jingdong\jdlogsys\IJDFileLogService.java

  

啥状况呢,就是说找不到readFromParcel方法。我看了一下CommonParamInfo类,确实没有这个方法,但是之前该重写的方法都重写了啊,之前一直也是这么做的。 于是我又接着搜索,找到了解决这个问题的方法,就是在CommonParamInfo类中自己添加一个readFromParcel方法

四、修改CommonParamInfo类,添加readFromParcel方法

package com.jingdong.jdlogsys.model;

import android.os.Parcel;
import android.os.Parcelable; /**
* Created by zhengqing on 2014/12/18.
*/
public class CommonParamInfo implements Parcelable {
public static final Parcelable.Creator<CommonParamInfo> CREATOR = new Creator<CommonParamInfo>() {
@Override
public CommonParamInfo[] newArray(int size) {
return new CommonParamInfo[size];
} @Override
public CommonParamInfo createFromParcel(Parcel in) {
return new CommonParamInfo(in);
}
};
public String strUid; //用户id
public String strUuid; //用户唯一标识,根据设备串号等唯一编码 public CommonParamInfo() {
// TODO Auto-generated constructor stub
}
@SuppressWarnings("unchecked")
public CommonParamInfo(Parcel in) {
// TODO Auto-generated constructor stub
strUid = in.readString();
strUuid = in.readString();
}
public void readFromParcel(Parcel in){
strUid = in.readString();
strUuid = in.readString();
}
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(strUid)
.append(strUuid);
return sb.toString();
}
public String getStrUid() {
return strUid;
}
public void setStrUid(String strUid) {
this.strUid = strUid;
}
public String getStrUuid() {
return strUuid;
}
public void setStrUuid(String strUuid) {
this.strUuid = strUuid;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeString(strUid);
out.writeString(strUuid);
}
}

  

其实readFromParcel方法的实现和构造函数中的内容是一样的。这样我们再次编译运行,发现没有任何问题了。

五、接着我又把第三步中的inout修改成了in

发现并没有报找不到readFromParcel方法的错误。


参考文章:

http://blog.csdn.net/jackyu613/article/details/6011606

http://blog.csdn.net/flowingflying/article/details/22276821


THE END.

aidl.exe'' finished with non-zero exit value 1问题解决【转载】的更多相关文章

  1. 新手写AIDL构建失败:...aidl.exe'' finished with non-zero exit value 1

    最近学习aidl,写demo后编译报错,跟着<Android开发艺术探索>以及网上的一些aidl详解博客敲完后一直编译不过,错误日志如下: Process 'command 'C:\Use ...

  2. Android Stduio 发生 Process 'command 'somePath:java.exe'' finished with non-zero exit value 2 异常的解决办法

    有时你会发现,在你使用Android Studio 进行编译的时候提示: Error:Execution failed for task ':demo:dexDebug'.> com.andro ...

  3. Process 'command 'D:\jdk8\jdk\bin\java.exe'' finished with non-zero exit value 2

    转载请标明出处,维权必究:https://www.cnblogs.com/tangZH/p/10539006.html 捣鼓了好久,现在已经不想说话,为何会出现这个问题,Process 'comman ...

  4. C:\Program Files\Java\jdk1.7.0_79\bin\java.exe'' finished with non-zero exit value 1

    转载请标明出处:https://www.cnblogs.com/tangZH/p/10538982.html 今天,在项目过程中碰到了这个奇怪的问题,C:\Program Files\Java\jdk ...

  5. gradle 编译 "aapt.exe'' finished with non-zero exit value 1 问题

    升级了一下android studio的版本,从3.0升级到3.3,升级过后,编译确实快了不少,但项目导入后一直报 "aapt.exe'' finished with non-zero ex ...

  6. Android Studio 编译报错:Process 'command 'D:\SDK\AS\sdk\build-tools\23.0.0\aapt.exe'' finished with non-zero exit value 1

    AGPBI: {"kind":"error","text":"No resource identifier found for a ...

  7. "com.android.ide.s.ProcessException:Process 'cand 'C:\Program Files\Java\jdk1.8.0_60\bin\java.exe'' finished with non-zero exit value 2"

    使用Android Studio 出现该问题: "com.android.ide.common.process.ProcessException: org.gradle.process.in ...

  8. 安卓编译出错: Process 'command 'C:\Java\jdk1.8.0_51\bin\java.exe'' finished with non-zero exit value 1 解决!

    安卓编译出错: Process 'command 'C:\Java\jdk1.8.0_51\bin\java.exe'' finished with non-zero exit value 1 解决! ...

  9. 解决appt.exe finished with non- zero exit value 1问题

    解决appt.exe finished with non- zero exit value 1问题 最近使用Android Studio时,经常遇到appt.exe finished with non ...

随机推荐

  1. 404 Note Found 现场编程

    目录 组员职责分工 github 的提交日志截图 程序运行截图 程序运行环境 GUI界面 基础功能实现 运行视频 LCG算法 过滤(降权)算法 算法思路 红黑树 附加功能一 背景 实现 附加功能二(迭 ...

  2. .net学习-扩展

    uwp uwpapp-斗鱼,微信等 云和移动优先 远程桌面连接设置 teamviewer V8内核 Node.js javascript 事件循环 express框架 bootstrap NoSQL ...

  3. Alpha 冲刺10

    队名:日不落战队 安琪(队长) 今天完成的任务 整理项目. okhttp学习第四弹. 明天的计划 okhttp学习第五弹. 阶段反思. 睡觉. 还剩下的任务 个人信息数据get. 遇到的困难 困难:好 ...

  4. sleep(),wait(),yield(),notify()

    sleep(),wait(),yield() 的区别 sleep方法和yield方法是Thread类的方法,wait方法是Object的方法. sleep 方法使当前运行中的线程睡眼一段时间,进入不可 ...

  5. Centos7更改默认启动桌面(或命令行)模式

    centos7以后是这样的,7以前就是别的版本了 1.systemctl get-default命令获取当前模式 2.systemctl set-default graphical.target 修改 ...

  6. php伪静态配置

    配置虚拟主机和伪静态 1.开启Apache的rewrite模块 LoadModule rewrite_module modules/mod_rewrite.so 2.开启虚拟主机功能 # Virtua ...

  7. webgl学习笔记四-动画

    写在前面 建议先阅读下前面我的三篇文章. webgl学习笔记一-绘图单点 webgl学习笔记二-绘图多点 webgl学习笔记三-平移旋转缩放   下面我们将讲解下如何让一个正方形动起来~不断擦除和重绘 ...

  8. MVC与MVP简单对比

    在Java平台,基于Spring等技术的MVC框架已经走向成熟:在.NET平台,微软也推出了MVC.MVP Framework,MVP不同于MVC的地方,关键在于,View不再显示的依赖于Busine ...

  9. 第86天:HTML5应用程序标签和智能表单

    一.HTML5应用程序标签 1.datalist需要数据载体 input list属性指向数据源 2.progress进度条 -webkit-appearance: none;   /*如果要改默认样 ...

  10. SQL Server Management Studio(SSMS)的使用与配置整理

    目录 目录 SQL Server Management Studio的使用与配置 1 设置SSMS显示行号 2 添加注释与取消注释的快捷键 3 新建查询的快捷键 4 开启sql语句TIME与IO的统计 ...