aidl.exe'' finished with non-zero exit value 1问题解决【转载】
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方法的实现和构造函数中的内容是一样的。这样我们再次编译运行,发现没有任何问题了。
发现并没有报找不到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问题解决【转载】的更多相关文章
- 新手写AIDL构建失败:...aidl.exe'' finished with non-zero exit value 1
最近学习aidl,写demo后编译报错,跟着<Android开发艺术探索>以及网上的一些aidl详解博客敲完后一直编译不过,错误日志如下: Process 'command 'C:\Use ...
- 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 ...
- 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 ...
- 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 ...
- gradle 编译 "aapt.exe'' finished with non-zero exit value 1 问题
升级了一下android studio的版本,从3.0升级到3.3,升级过后,编译确实快了不少,但项目导入后一直报 "aapt.exe'' finished with non-zero ex ...
- 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 ...
- "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 ...
- 安卓编译出错: 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 解决! ...
- 解决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 ...
随机推荐
- request.quest/query_string/params/body等方法介绍
假设url:http://192.168.1.111:8080/api/cluster/group?wzd=111&abc=cc 方法类型:POST,body是{"name" ...
- HDU 5672 String
题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5672 bc(中文):http://bestcoder.hdu.edu.cn/contests ...
- 01.1 Windows环境下JDK安装与环境变量配置详细的图文教程
01.1 Windows环境下JDK安装与环境变量配置详细的图文教程 本节内容:JDK安装与环境变量配置 以下是详细步骤 一.准备工具: 1.JDK JDK 可以到官网下载 http://www.or ...
- Strust2: 工作流程
以下为Struts2的体系结构图: Struts2框架处理用户请求,大体分为以下几个过程: (1)用户发出一个HttpServletRequest请求 (2)请求经过一系列过滤器,最后达到Filter ...
- (九) 使用Jmeter 做分布式压测 ;
在使用Jmeter进行性能测试时,如果并发数比较大(比如最近项目需要支持1000并发),单台电脑的配置(CPU和内存)可能无法支持,这时可以使用Jmeter提供的分布式测试的功能. 一.Jmeter分 ...
- C 语言疑难杂症 [转:http://blog.chinaunix.net/uid-20688544-id-1894880.html]
无聊在网上找了些C语言的东东练一下手,竟然发现其实还有好多细节之前,没注意到,该好好复习一下先. 解决掉的问题先不发出来,把疑问的先做个笔记,过几天解决了就回来修改补上. #include < ...
- ie浏览器升级的正确姿势
一.版本说明 1.当前IE浏览器分为一下几个版本:IE 6,IE 7,IE 8,IE 9,IE 10,IE 11 2.windows最高支持IE版本win xp:IE 8win 7 :IE 11win ...
- Web前端面试宝典(最新)
第一部分:HTML问答题 1.简述一下你对HTML语义化的理解? 用正确的标签做正确的事情. html语义化让页面的内容结构化,结构更清晰,便于对浏览器.搜索引擎解析;即使在没有样式CSS情况下也 ...
- mvc4中使用部分视图局部刷新实例
如上效果图,网页中有主视图(上)和部分视图(下),点击提交会把文本框中的值发送到服务器,再返回所有添加的信息,在下方局部更新(只更新部分视图),实现如下: 1.网页主视图代码: @model MvcA ...
- UVA11735_Corner the Queens
题目是这样的,游戏规则,每个人轮流将二维空间上的皇后往下,往左或者往斜下45度的方向移动. 谁第一个移动到0,0的位置就获胜. 题目给定你若干个矩形,求矩形中任取一点且该点必胜的概率有概率. 其实是这 ...