日期:2014-05-16  浏览次数:20513 次

Android ADB 完美支持中文 详细讲解(三)

修改ADB 代码全面支持中文

Adb 程序是控制台的程序,入口函数为main,第二个参数为char** 类型,所以从控制台输入Adb 命令的时候传入的字符串编码是GBK编码。第一步把main 函数修改成wmain ,那么传入的字符串编码就是unicode编码。

第一步:

int main(int argc,char **argv)

{

}

修改

int wmain(int argc, wchar_t **argv)

{

}

argv 是传入的参数,adb_commandline 函数接收的参数为char** 类型的,所以第二步把unicode 字符串的参数转换成UTF8编码然后传递给adb_commandline函数。由于argv 是数组,所以这里转换需要注意一下,先贴代码

 

第二步:

 

char arg1[256];
 char arg2[256];
 char arg3[256];
 char arg4[256];
 char arg5[256];
 char arg6[256];
 char arg7[256];
 char arg8[256];
 char arg9[256];
 char arg10[256];


 char* pTemp[10];
 pTemp[0] = arg1;
 pTemp[1] = arg2;
 pTemp[2] = arg3;
 pTemp[3] = arg4;
 pTemp[4] = arg5;
 pTemp[5] = arg6;
 pTemp[6] = arg7;
 pTemp[7] = arg8;
 pTemp[8] = arg9;
 pTemp[9] = arg10;

 for (int i=0;i<argc;i++)
 {
  std::string strTmp;
  Unicode_to_UTF8(argv[i],wcslen(argv[i]),strTmp);
  pTemp[i][strTmp.length()] = 0;
  strcpy(pTemp[i],strTmp.c_str());
 }
   return adb_commandline(argc - 1, pTemp + 1);

上面的代码里面用了10个(假设最大10个参数)局部变量数组,为什么不new 而是用局部变量。大家都知道new了之后就需要delete,在后面的处理过程中会改变new 的指针指向的地址,所以再delete的话就会出错了,当然这个也是有办法解决的,把new 出来的全部存起来,退出的时候delete 也可以,这里为了简单就直接用局部变量了。

 

现在传到 adb_commandline 函数里面的编码都是UTF8 编码的,对于英文和数字来说,UTF8编码和GBK编码在内存里面是一样的形式,所以这么修改之后如果只是传递英文和数字做为参数的话是不会有问题的。但是对于中文还要继续修改。打开文件CreateFileA, state这些函数需要修改成unicode 版本。之后修改 sysdeps_win32.cpp

 

第三部

CreateFileA ---》 修改成宽字符版本函数 CreateFile,搜索一下CreateFileA 全部修改一下。

file_sync_client.cpp  这个文件也要修改,修改的地方比较多, 最好是拿着代码一遍调试一遍修改。 和文件操作相关的都修改成宽字符版本就可以了。

 

第四步

针对每个命令去调试就可以修改差不多了,故意使用一些中文的名字来调试。

 

最后说一下进入  adb shell 时候中文处理

 

QQ群:115495155    共享了编译好的可执行文件