﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-淡泊明志、宁静致远-随笔分类-Android</title><link>http://www.cnitblog.com/houcy/category/8847.html</link><description>A Diamond is just a piece of Coal that did well under Pressure.</description><language>zh-cn</language><lastBuildDate>Mon, 26 Sep 2011 22:43:24 GMT</lastBuildDate><pubDate>Mon, 26 Sep 2011 22:43:24 GMT</pubDate><ttl>60</ttl><item><title>在32位Ubuntu10.04上编译Android2.3</title><link>http://www.cnitblog.com/houcy/archive/2011/02/10/72771.html</link><dc:creator>挑灯看剑</dc:creator><author>挑灯看剑</author><pubDate>Thu, 10 Feb 2011 06:39:00 GMT</pubDate><guid>http://www.cnitblog.com/houcy/archive/2011/02/10/72771.html</guid><wfw:comment>http://www.cnitblog.com/houcy/comments/72771.html</wfw:comment><comments>http://www.cnitblog.com/houcy/archive/2011/02/10/72771.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/houcy/comments/commentRss/72771.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/houcy/services/trackbacks/72771.html</trackback:ping><description><![CDATA[本人在Ubuntu10.04系统 32位机上安装编译Android2.3源码，其步骤和注意事项如下：<br><br>1.安装JDK6<br>对于Android2.3系统，不要安装JDK5，应该安装最新的JDK6。<br>如果安装了JDK6，Android会自动按64位编译，如果系统是32位的，会有编译错误，后面会说如何修改这个错误。<br>
<div class="code">sudo apt-get install sun-java6-jdk<br>sudo update-java-alternatives -s java-6-sun </div>
安装完后，需要手动设置JAVA_HOME, JRE_HOME, CLASS_PATH为JDK6的安装路径。<br><br>2. 安装各种包<br>$ sudo aptitude install git-core gnupg flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev<br><br>3. 安装Repo<br>$ mkdir ~/bin<br>$ export PATH=~/bin:$PATH<br>$ curl http://android.git.kernel.org/repo &gt; ~/bin/repo<br>$ chmod a+x ~/bin/repo<br><br>4. 下载Android源码<br>$mkdir ~/android2.3<br>$cd ~/android2.3<br>$ repo init -u git://android.git.kernel.org/platform/manifest.git<br>$ repo sync&nbsp; <br>这一步持续时间很长，整个源码+SDK共5G左右，我是下载了一个晚上才搞定，网速不给力啊。。。<br><br>5. 编译Android2.3<br>先export ANDROID_JAVA_HOME=$JAVA_HOME<br>
<div class="code">$ cd ~/<em>android2.3</em><br>$ source build/envsetup.sh<br>$ lunch<br>$ make<br></div>
在make的时候会提示出错：<br>
<blockquote style="border: 1px dashed #cccccc; margin: 5px 0px; padding: 8px 12px; overflow-x: auto; background-color: #f4f5f7;" class="blockquote">
<p style="margin: 0px 0px 15px;">************************************************************</p>
<p style="margin: 0px 0px 15px;">You are attempting to build on a 32-bit system.</p>
<p style="margin: 0px 0px 15px;">Only 64-bit build environments are supported beyond froyo/2.2.</p>
<p style="margin: 0px 0px 15px;">************************************************************</p>
</blockquote>因为Android2.3默认是64位的系统上编译，需要手动修改<span class="emphasis"><em>build/core/main.mk，把这个判断部分注释掉：<br></em>#ifneq (64,$(findstring 64,$(build_arch)))<br>#$(warning ************************************************************)<br>#$(warning You are attempting to build on a 32-bit system.)<br>#$(warning Only 64-bit build environments are supported beyond froyo/2.2.)<br>#$(warning ************************************************************)<br>#$(error stop)<br>#endif<br><br>重新make，如果是安装了JDK6版本，会又报错：<br>
<blockquote style="border: 1px dashed #cccccc; margin: 5px 0px; padding: 8px 12px; overflow-x: auto; background-color: #f4f5f7;" class="blockquote">
<p style="margin: 0px 0px 15px;">Docs droiddoc: out/target/common/docs/api-stubs</p>
<p style="margin: 0px 0px 15px;">Could not load &#8216;clearsilver-jni&#8217;</p>
<p style="margin: 0px 0px 15px;">java.library.path = out/host/linux-x86/lib</p>
<p style="margin: 0px 0px 15px;">make: *** [out/target/common/docs/api-stubs-timestamp] Error 45</p>
<p style="margin: 0px 0px 15px;">make: *** Waiting for unfinished jobs&#8230;.</p>
<p style="margin: 0px 0px 15px;">Could not load &#8216;clearsilver-jni&#8217;</p>
<p style="margin: 0px 0px 15px;">java.library.path = out/host/linux-x86/lib</p>
<p style="margin: 0px 0px 15px;">make: *** [out/target/common/docs/doc-comment-check-timestamp] Error 45</p>
</blockquote>这是由于clearsilver在编译时如果检测到使用Java JDK 6，就使用64位编译，因为Google的一个员工更新了几个文件。这里可以看到详细的修改记录：<a href="http://android.git.kernel.org/?p=platform/external/clearsilver.git;a=commitdiff;h=d36910a8110d8377b22301274d2b5131a732a72b">http://android.git.kernel.org/?p=platform/external/clearsilver.git;a=commitdiff;h=d36910a8110d8377b22301274d2b5131a732a72b</a><br>修改这几个文件，该回到32位编译环境即可：<br>
<li style="margin: 0px;" class="listitem">external/clearsilver/cgi/Android.mk
</li>
<li style="margin: 0px;" class="listitem">external/clearsilver/java-jni/Android.mk
</li>
<li style="margin: 0px;" class="listitem">external/clearsilver/util/Android.mk
</li>
<li style="margin: 0px;" class="listitem">external/clearsilver/cs/Android.mk
<p style="margin: 0px;" class="listitem">&nbsp;把编译选项-m64改成-m32即可<br><br>重新make,大概不到一个小时就make完了。</p>
</li>
</span>
<p>&#160;</p><img src ="http://www.cnitblog.com/houcy/aggbug/72771.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/houcy/" target="_blank">挑灯看剑</a> 2011-02-10 14:39 <a href="http://www.cnitblog.com/houcy/archive/2011/02/10/72771.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java与c/c++之间的数据交互-----jni点滴【转】</title><link>http://www.cnitblog.com/houcy/archive/2011/01/27/72733.html</link><dc:creator>挑灯看剑</dc:creator><author>挑灯看剑</author><pubDate>Thu, 27 Jan 2011 02:03:00 GMT</pubDate><guid>http://www.cnitblog.com/houcy/archive/2011/01/27/72733.html</guid><wfw:comment>http://www.cnitblog.com/houcy/comments/72733.html</wfw:comment><comments>http://www.cnitblog.com/houcy/archive/2011/01/27/72733.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/houcy/comments/commentRss/72733.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/houcy/services/trackbacks/72733.html</trackback:ping><description><![CDATA[<p>最近作一个tiemsten数据库的项目，用到了jni技术。在这个项目中，我们用java来写界面和业务逻辑，用c语言写数据库odbc访问。单纯的odbc其实没有什么难的，但是在java和c之间进行数据传递是比较麻烦的事情。两者之间数据的传递有这样几种情况：java和c之间基本数据类型的交互，java向c传递对象类型，c向java返回对象类型，c调用java类。下面就这样几种情况分类说明。</p>
<p><font style="BACKGROUND-COLOR: rgb(204,232,207)">1、java 向c传递基本数据类型</font></p>
<p><font style="BACKGROUND-COLOR: rgb(204,232,207)">对于基本数据类型，java和c是相互对应的，所以可以直接使用。它们的对应关系为; </font></p>
<p><font style="BACKGROUND-COLOR: rgb(204,232,207)">------------------------------------------------------------------------</font></p>
<p>Java类型　　&nbsp;&nbsp;&nbsp; 本地类型　　 字节(bit)</p>
<p>-------------------------------------------------------------------------<br>　　<br>　　boolean　　 jboolean　　 8, unsigned<br>　　byte　　　　jbyte　　　 　8<br>　　char　　　　jchar　　　　16, unsigned<br>　　short　　　 jshort　　　 16<br>　　int　　　　 jint　　　　 32<br>　　long　　　　jlong　　　　64<br>　　float　　　 jfloat　　　 32<br>　　double　　　jdouble　　　64<br>　　void　　　　void　　　　 n/a</p>
<p>------------------------------------------------------------------------</p>
<p>2.java向c传递对象类型</p>
<p>对于java传递进来的java对象模型，c要加载java类的原型，根据创建相应的c对象，获取java对象的方法的id,然后调用java对象的方法。举例说明：比如有个java类customer对象作为jni参数传递到c程序，customer有方法String getName()。</p>
<p>JNIEXPORT jobject JNICALL Java_com_oracle_estt_sc_db_impl_SCQueryODBC__1getCustomer<br>(JNIEnv *env, jobject,&nbsp;&nbsp;jobject customer){</p>
<p>jmethodID methodId;&nbsp;<br>&nbsp;//获得customer对象的句柄<br>&nbsp;&nbsp;&nbsp; jclass cls_objClass=env-&gt;GetObjectClass(customer);&nbsp;<br>&nbsp;//获得customer对象中特定方法getName的id&nbsp;<br>&nbsp;methodId=env-&gt;GetMethodID(cls_objClass,"getName","()Ljava/lang/String;");<br>&nbsp;//调用customer对象的特定方法getName<br>&nbsp;jstring&nbsp; js_name=(jstring)env-&gt;CallObjectMethod(customer,methodId,NULL);</p>
<p>...</p>
<p>}</p>
<p>3.c向java返回对象类型</p>
<p>在c程序中首先要创建要返回的java对象，得到每个属性的id，然后给每个属性赋值，最后返回。举例说明：同样是customer对象，有name等属性值，需要在c程序中给每个属性赋值后返回。</p>
<p>JNIEXPORT jobject JNICALL Java_com_oracle_estt_sc_db_impl_SCQueryODBC__1getCustomer<br>(JNIEnv *env, jobject,&nbsp;&nbsp;jobject customer){</p>
<p>......</p>
<p>//发现java Customer类，如果失败，程序返回 <br>&nbsp;jclass&nbsp;&nbsp; clazz = env-&gt;FindClass("com/oracle/estt/sc/busi/Customer");&nbsp;&nbsp; <br>&nbsp;if(clazz == 0)&nbsp; <br>&nbsp;&nbsp;return&nbsp;&nbsp; 0;&nbsp;&nbsp;&nbsp; <br>&nbsp;//为新的java类对象obj分配内存&nbsp;&nbsp;&nbsp; <br>&nbsp;jobject&nbsp;&nbsp; obj = env-&gt;AllocObject(clazz);&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;//发现类中的属性，如果失败，程序返回&nbsp;&nbsp; <br>&nbsp;jfieldID&nbsp;&nbsp; fid_id = env-&gt;GetFieldID(clazz,"customerID","I");&nbsp; <br>&nbsp;if (fid_id&nbsp; ==&nbsp; 0)&nbsp; <br>&nbsp;&nbsp;return&nbsp;&nbsp; 0;<br>&nbsp;jfieldID&nbsp;&nbsp; fid_name = env-&gt;GetFieldID(clazz,"name","Ljava/lang/String;");&nbsp; <br>&nbsp;if (fid_name&nbsp; ==&nbsp; 0)&nbsp; <br>&nbsp;&nbsp;return&nbsp;&nbsp; 0;<br>......</p>
<p>&nbsp;env-&gt;SetIntField(obj, fid_id,&nbsp;1<br>&nbsp;env-&gt;SetObjectField(obj, fid_name, jname);</p>
<p>......</p>
<p>return obj;</p>
<p>}</p>
<p>4.c向java传递一个含有java对象的数组</p>
<p>对于这种情况，先得到数组的大小，接下来取出数组中的对象，取得对象的属性值或者调用对象的方法，将获得值存到本地数组中，然后可以灵活使用这些数据了。举例说明：java向c传递一个含有多个customer对象的数组，在c中将这个数组的分解出来，存到本地的临时数组中去。</p>
<p>JNIEXPORT void JNICALL Java_com_oracle_estt_sc_db_impl_SCInsertODBC__1insertCustomeRequest___3Lcom_oracle_estt_sc_busi_CustomerRequest_2<br>(JNIEnv *env, jobject, jobjectArray oa){</p>
<p>......&nbsp;</p>
<p>//声明customerrequest对象<br>&nbsp;jobject o_customer;</p>
<p>&nbsp;int i;<br>&nbsp;jmethodID methodId;&nbsp;<br>&nbsp;jint size=env-&gt;GetArrayLength(oa);</p>
<p>_tmp_bind[0]= (char *)malloc(size*sizeof(int));<br>&nbsp;_tmp_bind[1]= (char *)malloc(size*sizeof(char)*( 20 + 1));</p>
<p>...</p>
<p>//将输入数组的数据拷贝到临时数组中去<br>&nbsp;for(i=0;i&lt;size;i++){<br>&nbsp;//从数组中获得customerrequest对象<br>&nbsp;&nbsp;&nbsp; o_request=env-&gt;GetObjectArrayElement(oa,i);<br>&nbsp;//获得customerrequest对象的句柄<br>&nbsp;jclass cls_objClass=env-&gt;GetObjectClass(o_request);<br>&nbsp;<br>&nbsp;//获得customerrequest对象的特定方法getCustomerID的id<br>&nbsp;methodId=env-&gt;GetMethodID(cls_objClass,"getCustomerID","()I");<br>&nbsp;//调用customerrequest对象的特定方法getCustomerID<br>&nbsp;int_customerID=env-&gt;CallIntMethod(o_request,methodId,NULL);&nbsp;<br>&nbsp;//获得customerrequest对象中特定方法getTelNum的id&nbsp;<br>&nbsp;methodId=env-&gt;GetMethodID(cls_objClass,"getTelNum","()Ljava/lang/String;");<br>&nbsp;//调用customerrequest对象的特定方法getTelNum<br>&nbsp;str_telNum=(jstring)env-&gt;CallObjectMethod(o_request,methodId,NULL);&nbsp;</p>
<p>...</p>
<p>//将用户id拷贝到临时数组<br>&nbsp;memcpy(_tmp_bind[0]+i*sizeof(int),&amp;int_customerID,sizeof(int));</p>
<p>&nbsp;//将电话号码拷贝到临时数组，如果电话号码字符串超长，报错返回<br>&nbsp;if(sizeof(char)*strlen(chr_tel)&lt;=sizeof(char)*( 20 + 1)){<br>&nbsp;memcpy(_tmp_bind[1]+i*sizeof(char)*( 20+1 ),chr_tel,strlen(chr_tel)+1);<br>&nbsp;}else{<br>&nbsp;printf("%s too long!\n",chr_tel);<br>&nbsp;return;<br>&nbsp;}</p>
<p>...</p>
<p>}</p>
<p>...</p>
<p>}</p>
<p>5.c向java返回一个数组</p>
<p>先创建数组，然后加载java对象，给每个java对象的属性赋值，添加到数组中，最后返回数组。如下例：</p>
<p>JNIEXPORT jobjectArray JNICALL Java_com_oracle_estt_sc_db_impl_SCQueryODBC__1getCustomerRequest<br>(JNIEnv *env, jobject, jint customerid){</p>
<p>......</p>
<p>&nbsp;//声明存放查询结果的objectarray<br>&nbsp;jobjectArray jo_array = env-&gt;NewObjectArray(MAX_LINE,env-&gt;FindClass("com/oracle/estt/sc/busi/CustomerRequest"), 0);&nbsp;&nbsp;jobject&nbsp;obj;<br>&nbsp;//发现java Customerrequest类，如果失败，程序返回 <br>&nbsp;jclass&nbsp;&nbsp; clazz = env-&gt;FindClass("com/oracle/estt/sc/busi/CustomerRequest");&nbsp;&nbsp; <br>&nbsp;if(clazz == 0)&nbsp; <br>&nbsp;&nbsp;return&nbsp;&nbsp; 0;</p>
<p>&nbsp;while ((rc = SQLFetch(hstmt)) == SQL_SUCCESS ||rc == SQL_SUCCESS_WITH_INFO) {</p>
<p>&nbsp;obj = env-&gt;AllocObject(clazz);</p>
<p>jfieldID&nbsp;&nbsp; fid_customerID = env-&gt;GetFieldID(clazz,"customerID","I");&nbsp; <br>&nbsp;&nbsp;if (fid_customerID&nbsp; ==&nbsp; 0)&nbsp; <br>&nbsp;&nbsp;&nbsp;return&nbsp;&nbsp; 0;</p>
<p>jfieldID&nbsp;&nbsp; fid_priority = env-&gt;GetFieldID(clazz,"priority","I");&nbsp; <br>&nbsp;&nbsp;if (fid_priority&nbsp; ==&nbsp; 0)&nbsp; <br>&nbsp;&nbsp;&nbsp;return&nbsp;&nbsp; 0;</p>
<p>...</p>
<p>env-&gt;SetIntField(obj, fid_customerID, col_customerID);</p>
<p>env-&gt;SetIntField(obj, fid_priority, col_priority); </p>
<p>...</p>
<p>//将对象obj添加到object array中<br>&nbsp;&nbsp;if(j&lt;MAX_LINE){<br>&nbsp;&nbsp;&nbsp;env-&gt;SetObjectArrayElement(jo_array, j, obj);<br>&nbsp;&nbsp;}else{<br>&nbsp;&nbsp;&nbsp;break;<br>&nbsp;&nbsp;}</p>
<p>}</p>
<p>return jo_array;</p>
<p>}</p>
<p>6.jstring向char* 的转换</p>
<p>jstring不能直接在c程序中使用，需要转换成char*。重要的一点是，在使用完char*之后，一定要记得将其释放，以免发生内存泄漏。如下例：</p>
<p>JNIEXPORT jobjectArray JNICALL Java_com_oracle_estt_sc_db_impl_SCQueryODBC__1getCustomerRequestByCondition<br>(JNIEnv *env, jobject, jstring condition, jint customerid){</p>
<p>//将jstring转换为cha*<br>&nbsp;char* str_condition=(char*) env-&gt;GetStringUTFChars(condition,JNI_FALSE);</p>
<p>......</p>
<p>//释放变量<br>&nbsp;env-&gt;ReleaseStringUTFChars(condition,str_condition);</p>
<p>......</p>
<p>}</p>
<p>7.char*转换成jstring</p>
<p>这个转换就比较麻烦了，但是在数据库操作时会用到。比如，从数据库查询得到的是char*,但是给对象属性赋值的时候需要用jstring，这是需要用到这种转换。具体如下例：</p>
<p>char* col_timestamp=.....;</p>
<p>//加载string类<br>&nbsp;jclass strClass = env-&gt;FindClass("Ljava/lang/String;");<br>&nbsp;//获得方法id<br>&nbsp;jmethodID ctorID = env-&gt;GetMethodID(strClass, "&lt;init&gt;", "([BLjava/lang/String;)V");</p>
<p>//将字符串转换为jstring&nbsp;&nbsp;<br>&nbsp;&nbsp;bytes_time = env-&gt;NewByteArray(strlen(col_timestamp));<br>&nbsp;&nbsp;env-&gt;SetByteArrayRegion(bytes_time, 0, strlen(col_timestamp), (jbyte*)col_timestamp);<br>&nbsp;&nbsp;jstring js_time = env-&gt;NewStringUTF("utf-8");</p>
<p>js_time=(jstring)env-&gt;NewObject(strClass, ctorID, bytes_time, js_time)</p>
<p>8.java类的原型获取方法</p>
<p>在c中创建java对象和调用java对象方法时需要用到java类的原型，特别是其方法签名。具体办法是：到java类所在的目录下，键入名命令: </p>
<p>&gt;javap -s -p 包路径.java类名</p>
<p>以上几点是我这两天写jni程序的一点总结，写出来与大家分享，欢迎批评指导。</p>
<p>推荐资料：</p>
<h1><font size=1>Java Native Interface Specification.<a href="http://java.sun.com/j2se/1.5.0/docs/guide/jni/spec/jniTOC.html" target=_blank><u><font color=#a40000 size=2>http://java.sun.com/j2se/1.5.0/docs/guide/jni/spec/jniTOC.html</font></u></a></font></h1>
<img src ="http://www.cnitblog.com/houcy/aggbug/72733.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/houcy/" target="_blank">挑灯看剑</a> 2011-01-27 10:03 <a href="http://www.cnitblog.com/houcy/archive/2011/01/27/72733.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android img解压、替换及打包【转】</title><link>http://www.cnitblog.com/houcy/archive/2011/01/27/72732.html</link><dc:creator>挑灯看剑</dc:creator><author>挑灯看剑</author><pubDate>Thu, 27 Jan 2011 01:50:00 GMT</pubDate><guid>http://www.cnitblog.com/houcy/archive/2011/01/27/72732.html</guid><wfw:comment>http://www.cnitblog.com/houcy/comments/72732.html</wfw:comment><comments>http://www.cnitblog.com/houcy/archive/2011/01/27/72732.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/houcy/comments/commentRss/72732.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/houcy/services/trackbacks/72732.html</trackback:ping><description><![CDATA[拿到一分android 的img文件后，如果你想替换里面的库或者执行程序，你可以用xyaffs2将img解压，然后将对应的lib或者执行程序替换掉，然后再用mkyaffs2image打包成新的img文件。具体如下：
<p>&nbsp;&nbsp;&nbsp; 1 解压</p>
<p>&nbsp;&nbsp;&nbsp; xyaffs2 img_file output_dir</p>
<p>&nbsp;&nbsp;&nbsp; xyaffs2可以从下面找到：<br></p>
<p>&nbsp;&nbsp;&nbsp; <a href="http://limodev.cn/download/xyaffs.tar.gz" target=_blank><u><font color=#a40000 size=2>http://limodev.cn/download/xyaffs.tar.gz</font></u></a></p>
<p>&nbsp;&nbsp;&nbsp; 2 替换</p>
<p>&nbsp;&nbsp;&nbsp; 库文件在lib目录下，执行程序在xbin目录下，你可以把自己的库文件和执行程序放进去。</p>
<p>&nbsp;&nbsp;&nbsp; 3 打包</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; mkyaffs2image [-f] [-c &lt;size&gt;] [-s &lt;size&gt;] dir image_file [convert]</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; mkyaffs2image可以直接从yaffs2网站上找到，或者直接用android open source里面的。<br></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; ./out/host/linux-x86/bin/mkyaffs2image<br></p>
<img src ="http://www.cnitblog.com/houcy/aggbug/72732.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/houcy/" target="_blank">挑灯看剑</a> 2011-01-27 09:50 <a href="http://www.cnitblog.com/houcy/archive/2011/01/27/72732.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android dex ，xml 文件反编译方法【转】</title><link>http://www.cnitblog.com/houcy/archive/2011/01/27/72731.html</link><dc:creator>挑灯看剑</dc:creator><author>挑灯看剑</author><pubDate>Thu, 27 Jan 2011 01:49:00 GMT</pubDate><guid>http://www.cnitblog.com/houcy/archive/2011/01/27/72731.html</guid><wfw:comment>http://www.cnitblog.com/houcy/comments/72731.html</wfw:comment><comments>http://www.cnitblog.com/houcy/archive/2011/01/27/72731.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/houcy/comments/commentRss/72731.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/houcy/services/trackbacks/72731.html</trackback:ping><description><![CDATA[Dex 文件是Android上运行于delvik的java二进制文件，如果你对其中的内容感兴趣而开发人员没有公布源代码，你可以用如下方法反编译dex文件：
<p>&nbsp;&nbsp;&nbsp; 1 解压system.img</p>
<p>&nbsp;&nbsp;&nbsp; 用xyaffs2解压system.img 等你所需要解压的img文件：</p>
<p>&nbsp;&nbsp;&nbsp; xyaffs2 img_file output_dir</p>
<p>&nbsp;&nbsp;&nbsp; xyaffs2可以从如下地址下载：</p>
<p>&nbsp;&nbsp;&nbsp; <a href="http://limodev.cn/download/xyaffs.tar.gz" target=_blank><u><font color=#a40000 size=2>http://limodev.cn/download/xyaffs.tar.gz</font></u></a></p>
<p>&nbsp;&nbsp;&nbsp; 2 从输出目录找到你感兴趣的apk包，用unzip解压apk文件包：</p>
<p>&nbsp;&nbsp;&nbsp; unzip ContactsProvider.apk</p>
<p>&nbsp;&nbsp;&nbsp; 3 用dex2jar工具将解压后的文件夹中的classes.dex转换成jar文件：</p>
<p>&nbsp;&nbsp;&nbsp; dex2jar.sh classes.dex</p>
<p>&nbsp;&nbsp;&nbsp; 或者</p>
<p>&nbsp;&nbsp;&nbsp; dex2jar.bat classes.dex</p>
<p>&nbsp;&nbsp;&nbsp; dex2jar的下载地址如下：<br></p>
<p>&nbsp;&nbsp;&nbsp; <a href="http://code.google.com/p/dex2jar/" target=_blank><u><font color=#a40000 size=2>http://code.google.com/p/dex2jar/</font></u></a></p>
<p>&nbsp;&nbsp;&nbsp; 非常感谢这个工具的作者 "pxb1988",我不知道作者的全名，就写了作者的网名了。 </p>
<p>&nbsp;&nbsp;&nbsp; 4 用unzip解压jar文件：</p>
<p>&nbsp;&nbsp;&nbsp; unzip classes.dex.dex2jar.jar</p>
<p>&nbsp;&nbsp;&nbsp; 5 用DJ java decompiler 反编译jar包中的class文件</p>
<p>&nbsp;&nbsp;&nbsp; DJ一般有图形化界面，操作很简单，可以单个文件反编译，也可以批量反编译。DJ的下载地址如下：</p>
<p>&nbsp;&nbsp;&nbsp; <a href="http://members.fortunecity.com/neshkov/dj.html" target=_blank><u><font color=#a40000 size=2>http://members.fortunecity.com/neshkov/dj.html</font></u></a></p>
<p>&nbsp;&nbsp;&nbsp; 在批量反编译时，注意将输出文件后缀改为java，默认的输出文件后缀为jad。</p>
<p>&nbsp;&nbsp;&nbsp; 6 用AXMLPrinter反编译xml文件：</p>
<p>&nbsp;&nbsp;&nbsp; <code>java -jar AXMLPrinter2.jar AndroidManifest.xml AndroidManifest2.xml <br></code></p>
<p><code>&nbsp;&nbsp;&nbsp; </code>AXMLPrinter的下载地址如下：</p>
<p>&nbsp;&nbsp;&nbsp; <a href="http://android4me.googlecode.com/files/AXMLPrinter2.jar" target=_blank><u><font color=#a40000 size=2>http://android4me.googlecode.com/files/AXMLPrinter2.jar</font></u></a></p>
<p>&nbsp;&nbsp;&nbsp; 最后，感谢以上开源软件的开发者，他们的努力工作使android的反编译容易了很多，而且反编译出来的代码可读性很高。再次感谢！<br></p>
<img src ="http://www.cnitblog.com/houcy/aggbug/72731.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/houcy/" target="_blank">挑灯看剑</a> 2011-01-27 09:49 <a href="http://www.cnitblog.com/houcy/archive/2011/01/27/72731.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>