Android adb push在简中window乱码问题_weixin_30662539的博客-程序员宝宝

技术标签: 运维  

adb readdir在windows(简体)下读取出来为GBK,而Android使用UTF-8编码,导致adb push传入机器内为乱码。

1. 安装mingw32
  sudo apt-get install mingw32

2. 修改adb源码
  file_sync_client.c  

 1 diff --git a/adb/file_sync_client.c b/adb/file_sync_client.c
2 old mode 100644
3 new mode 100755
4 index 64e393c..028b966
5 --- a/adb/file_sync_client.c
6 +++ b/adb/file_sync_client.c
7 @@ -26,6 +26,10 @@
8 #include <sys/types.h>
9 #include <zipfile/zipfile.h>
10
11 +#ifdef USE_MINGW
12 +#include <windows.h>
13 +#endif
14 +
15 #include "sysdeps.h"
16 #include "adb.h"
17 #include "adb_client.h"
18 @@ -568,6 +572,40 @@ struct copyinfo
19 //char data[0];
20 };
21
22 +static int GBKToUTF8(unsigned char *lpGBKStr, unsigned char *lpUTF8Str, int nUTF8StrLen)
23 +{
24 + wchar_t *lpUnicodeStr = NULL;
25 + int nRetLen = 0;
26 +
27 + if (!lpGBKStr) return 0;
28 +
29 + nRetLen = MultiByteToWideChar(CP_ACP, 0, (char *)lpGBKStr, -1, NULL, NULL);
30 + lpUnicodeStr = malloc(sizeof(WCHAR) * (nRetLen + 1));
31 + nRetLen = MultiByteToWideChar(CP_ACP, 0, (char *)lpGBKStr, -1, lpUnicodeStr, nRetLen);
32 +
33 + if (!nRetLen) return 0;
34 +
35 + nRetLen = WideCharToMultiByte(CP_UTF8, 0, lpUnicodeStr, -1, NULL, 0, NULL, NULL);
36 + if (!lpUTF8Str)
37 + {
38 + if (lpUnicodeStr) free(lpUnicodeStr);
39 + return nRetLen;
40 + }
41 +
42 + if (nUTF8StrLen < nRetLen)
43 + {
44 + if (lpUnicodeStr) free(lpUnicodeStr);
45 + return 0;
46 + }
47 +
48 + nRetLen = WideCharToMultiByte(CP_UTF8, 0, lpUnicodeStr, -1, (char *)lpUTF8Str,
49 + nUTF8StrLen, NULL, NULL);
50 +
51 + if (lpUnicodeStr) free(lpUnicodeStr);
52 +
53 + return nRetLen;
54 +}
55 +
56 copyinfo *mkcopyinfo(const char *spath, const char *dpath,
57 const char *name, int isdir)
58 {
59 @@ -577,12 +615,19 @@ copyinfo *mkcopyinfo(const char *spath, const char *dpath,
60 int ssize = slen + nlen + 2;
61 int dsize = dlen + nlen + 2;
62
63 +#ifdef USE_MINGW
64 + int name_len = GBKToUTF8((unsigned char *)name, NULL, NULL);
65 + char UTF8name[PATH_MAX];
66 + name_len = GBKToUTF8((unsigned char *)name, (unsigned char *)UTF8name, name_len);
67 + dsize = dlen + name_len + 2;
68 +#endif
69 +
70 copyinfo *ci = malloc(sizeof(copyinfo) + ssize + dsize);
71 if(ci == 0) {
72 fprintf(stderr,"out of memory\n");
73 abort();
74 }
75 -
76 +
77 ci->next = 0;
78 ci->time = 0;
79 ci->mode = 0;
80 @@ -591,13 +636,12 @@ copyinfo *mkcopyinfo(const char *spath, const char *dpath,
81 ci->src = (const char*)(ci + 1);
82 ci->dst = ci->src + ssize;
83 snprintf((char*) ci->src, ssize, isdir ? "%s%s/" : "%s%s", spath, name);
84 - snprintf((char*) ci->dst, dsize, isdir ? "%s%s/" : "%s%s", dpath, name);
85 + snprintf((char*) ci->dst, dsize, isdir ? "%s%s/" : "%s%s", dpath, UTF8name);
86
87 // fprintf(stderr,"mkcopyinfo('%s','%s')\n", ci->src, ci->dst);
88 return ci;
89 }
90
91 -
92 static int local_build_list(copyinfo **filelist,
93 const char *lpath, const char *rpath)
94 {

 

3. 编译adb
  source build/envsetup.sh
  mm acp
  mm USE_MINGW=y adb 

4. 调试adb
  拷贝out/host/windows-x86/obj/EXECUTABLES/adb_intermediates到cygwin目录下,使用gdb调试(可修改Android.mk中的CFLAG为-O0调试)。 

 

adb_windows

转载于:https://www.cnblogs.com/TZtrue/archive/2011/12/01/2271269.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30662539/article/details/99843985

智能推荐

文献阅读2_彭于晏程序分晏的博客-程序员宝宝

Efficient Multi-User Computation Offloading for Mobile-Edge Cloud Computing(移动边缘云计算的高效多用户计算分流)摘要移动边缘云计算是一种新范例,可在与移动用户紧邻的普及无线电接入网络的边缘提供云计算功能。在本文中,我们首先研究了在多信道无线干扰环境下移动边缘云计算的多用户计算卸载问题。我们证明计算集中式最优解是NP难的,因此采用了博弈论的方法来以分布式方式实现有效的计算卸载。我们将移动设备用户之间的分布式计算卸载决策问题公式化为

通过addEventListener 绑定的事件会出现多次调用方法的情况_tang_jian_dong的博客-程序员宝宝_addeventlistener message

这会出现两次window.addEventListener("message", function( event ) { alert(event.data)});改为这种, 只会出现一次window.onmessage=function(event){ alert(event.data)}...

RK3399驱动开发 | 01 -RK3399 gpio的使用(用户态和设备树两种方式)_Mculover666的博客-程序员宝宝_rk3399驱动开发

一、RK3399的GPIORK3399有5组GPIO,GPIO0-GPIO4,每一组GPIO成为一个GPIO bank,每组GPIO包含32个引脚,需要注意,不是所有 bank 都有全部编号,例如 GPIO4 就只有 C0-C7,D0-D2,所以一共有122个可用GPIO二、计算GPIO编号Friendly的开发板上板载一个状态LED,如下:该LED接在GPIO0_B5上,想要使用这个GPIO,需要手动计算GPIO引脚编号。GPIO计算公式为:pin=bank∗32+group∗8+xp

CSS3练习笔记_谈晓鸣的博客-程序员宝宝_css 边框动画

CSS3被划分为模块,其中最重要的CSS3模块包括:选择器框模型背景和边框文本效果2D/3D转换动画多列布局用户界面1、边框border-image:设置所有border-image-*属性的简写形式。可能的值有:border-image-source:用在边框的图片的路径;border-image-slice:图片边框向内偏移;border-image-width:图片边框的宽度;border-image-outset:边框图像区域超出边框的量;border-image-repe

XML中的转义字符_土豆吞噬者的博客-程序员宝宝_xml转义字符

XML中不允许出现一些特殊字符,这些字符需要使用转义字符代替显示结果描述转义字符十进制&amp;nbsp;空格&amp;amp;nbsp;&amp;amp;#160;&amp;lt;小于号&amp;amp;lt;&amp;amp;#60;&amp;gt;大于号&amp;amp;gt;&amp;amp;#62;&amp;amp;与号&amp;amp;amp;&amp;amp;#38;&quot;双引号&amp;amp;quot;&

php脚本是啥意思,php脚本是什么意思_火石创造的博客-程序员宝宝

脚本英文为Script,是一种批处理文件的延伸,是一种纯文本保存的程序,一般来说的计算机脚本程序是确定的一系列控制计算机进行运算操作动作的组合,在其中可以实现一定的逻辑分支等。实际上脚本就是程序,一般都是有应用程序提供的编程语言。应用程序包括浏览器(javascript、VBScript)、多媒体创作工具,应用程序的宏和创作系统的批处理语言也可以归入脚本之类。(推荐学习:PHP编程从入门到精通)脚...

随便推点

取球游戏——第三届蓝桥杯省赛C语言A组第10题_FlyingPiggy-MissW的博客-程序员宝宝

今盒子里有n个小球,A、B两人轮流从盒中取球,每个人都可以看到另一个人取了多少个,也可以看到盒中还剩下多少个,并且两人都很聪明,不会做出错误的判断。每个人从盒子中取出的球的数目必须是:1,3,7或者8个。轮到某一方取球时不能弃权!A先取球,然后双方交替取球,直到取完。被迫拿到最后一个球的一方为负方(输方)请编程确定出在双方都不判断失误的情况下,对于特定的初始球数

Qt QML 基于平行四边形的进度条(Matrix4x4、drag)_火山上的企鹅的博客-程序员宝宝_qml 进度条

先上gif图思路:先实现平行四边形: 通过 Rectangle 的矩阵变化来实现 (transform: Matrix4x4):Rectangle { id: rect anchors.fill: parent color: "lightblue" // 切变矩阵 transform: Matrix4x4 { matrix: Qt.matrix4x4(1, xs, 0, 0, // xs平方向切变 +表示朝右

iPad3/iPad2/iPad 5.1.1完美越狱WIN版详细教程_artwebs的博客-程序员宝宝

Absinthe 2.0.4 更新 最新更新:5月30日,iOS 5.1.1完美越狱工具Absinthe 2.0.4再次更新!完美支持iPad2,4 iOS 5.1.1Absinthe 2.0.4(Win版下载地址    mac版下载地址    Linux版下载地址)已经越狱的不需要再重新越狱,这次更新最主要增加了对遗留的 iPad 2,4的支持。到现在为止还未成功

什么是ForkJoin、ForkJoin分支合并、ForkJoin工作窃取、ForkJoin大数据求和计算_郝开的博客-程序员宝宝

什么是ForkJoin、ForkJoin分支合并、ForkJoin工作窃取、ForkJoin大数据求和计算什么是ForkJoin?ForkJoin:分支合并ForkJoin特点:工作窃取如何让使用ForkJoinForkJoin求和计算Demo什么是ForkJoin?ForkJoin(分支合并)是jdk1.7之后出来的,并行执行任务,提高效率,用在大数据量场景下。大数据:Map Reduce(把大任务拆分成多个小任务,怎么拆分用到了二分算法),每个小任务得出自己的结果,之后再把结果汇总,汇总的过程就是

数据结构与算法之线性表基础——顺序表(C与C++双人打)_源代码•宸的博客-程序员宝宝

人狠话不多,干货先上咯先来个简单的线性表基本构造代码以及响应的运行测试程序seq.h#include&lt;stdio.h&gt;#include&lt;string.h&gt;#define MAXSIZE 100 //定义线性表的最大长度typedef struct{ char key[15]; //结点的关键字 char name[20]; int age;}DATA; //定义结点类型,可定义为简单类型,也可定义为结构typedef struct

Pandas作业练习_weixin_42331532的博客-程序员宝宝

```pythonimport pandas as pdimport numpy as np#读数据lianjia_df = pd.read_csv(r'lianjia9.csv')#print(lianjia_df)# 1. 观察结构,调整列索引顺序#如何调整呢?,就是查找所有数据,将排好序的标签填进去,达到各列换位的一种效果print(lianjia_df[["Region","Garden","Layout","Floor","Year","Size","Elevator","Di.