﻿<?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>C++博客-Codejie's C++ Space</title><link>http://www.cppblog.com/codejie/</link><description>Using C++</description><language>zh-cn</language><lastBuildDate>Sat, 04 Apr 2026 07:43:27 GMT</lastBuildDate><pubDate>Sat, 04 Apr 2026 07:43:27 GMT</pubDate><ttl>60</ttl><item><title>OpenCV : build with Glade on Android Studio</title><link>http://www.cppblog.com/codejie/archive/2015/04/14/210337.html</link><dc:creator>codejie</dc:creator><author>codejie</author><pubDate>Tue, 14 Apr 2015 15:54:00 GMT</pubDate><guid>http://www.cppblog.com/codejie/archive/2015/04/14/210337.html</guid><wfw:comment>http://www.cppblog.com/codejie/comments/210337.html</wfw:comment><comments>http://www.cppblog.com/codejie/archive/2015/04/14/210337.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/codejie/comments/commentRss/210337.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/codejie/services/trackbacks/210337.html</trackback:ping><description><![CDATA[<br />FROM : <a href="http://stackoverflow.com/questions/17767557/how-to-use-opencv-in-android-studio-using-gradle-build-tool">http://stackoverflow.com/questions/17767557/how-to-use-opencv-in-android-studio-using-gradle-build-tool</a><br /><br /><br /><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; font-size: 15px; clear: both; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 19.5px; background-color: #ffffff;">Android Studio 0.8.2+ and above, could easily import modules. Thanks to TGMCains answer, is simplified, by using Android Studio itself to import OpenCV as a module.</p><ol style="margin: 0px 0px 1em 30px; padding: 0px; border: 0px; font-size: 15px; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 19.5px; background-color: #ffffff;"><li style="margin: 0px 0px 0.5em; padding: 0px; border: 0px; word-wrap: break-word;"><strong style="margin: 0px; padding: 0px; border: 0px;">Download</strong>&nbsp;latest OpenCV sdk for Android from&nbsp;<a href="http://opencv.org/downloads.html" rel="nofollow" style="margin: 0px; padding: 0px; border: 0px; cursor: pointer; color: #0c65a5; text-decoration: none;">OpenCV.org</a>&nbsp;and decompress the zip file.</li><li style="margin: 0px 0px 0.5em; padding: 0px; border: 0px; word-wrap: break-word;"><strong style="margin: 0px; padding: 0px; border: 0px;">Import OpenCV to Android Studio</strong>, From&nbsp;<em style="margin: 0px; padding: 0px; border: 0px;">File -&gt; Import Module</em>, choose&nbsp;<em style="margin: 0px; padding: 0px; border: 0px;">sdk/java</em>&nbsp;folder in the unzipped opencv archive.</li><li style="margin: 0px 0px 0.5em; padding: 0px; border: 0px; word-wrap: break-word;"><strong style="margin: 0px; padding: 0px; border: 0px;">Update build.gradle</strong>&nbsp;under imported OpenCV module to update 4 fields to match your project build.gradle a) compileSdkVersion b) buildToolsVersion c) minSdkVersion and 4) targetSdkVersion.</li><li style="margin: 0px 0px 0.5em; padding: 0px; border: 0px; word-wrap: break-word;"><strong style="margin: 0px; padding: 0px; border: 0px;">Add module dependency</strong>&nbsp;by&nbsp;<em style="margin: 0px; padding: 0px; border: 0px;">Application -&gt; Module Settings</em>, and select the&nbsp;<em style="margin: 0px; padding: 0px; border: 0px;">Dependencies</em>tab. Click&nbsp;<em style="margin: 0px; padding: 0px; border: 0px;">+</em>&nbsp;icon at bottom, choose&nbsp;<em style="margin: 0px; padding: 0px; border: 0px;">Module Dependency</em>&nbsp;and select the imported OpenCV module.</li><li style="margin: 0px 0px 0.5em; padding: 0px; border: 0px; word-wrap: break-word;"><strong style="margin: 0px; padding: 0px; border: 0px;">Copy&nbsp;<em style="margin: 0px; padding: 0px; border: 0px;">libs</em></strong>&nbsp;folder under&nbsp;<em style="margin: 0px; padding: 0px; border: 0px;">sdk/native</em>&nbsp;to Android Studio under&nbsp;<em style="margin: 0px; padding: 0px; border: 0px;">app/src/main</em>.</li><li style="margin: 0px 0px 0.5em; padding: 0px; border: 0px; word-wrap: break-word;">In Android Studio,&nbsp;<strong style="margin: 0px; padding: 0px; border: 0px;">rename the copied&nbsp;<em style="margin: 0px; padding: 0px; border: 0px;">libs</em>&nbsp;directory to&nbsp;<em style="margin: 0px; padding: 0px; border: 0px;">jniLibs</em></strong>&nbsp;and we are done.</li></ol><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; font-size: 15px; clear: both; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 19.5px; background-color: #ffffff;">Step (6) is since Android studio expects native libs in&nbsp;<code style="margin: 0px; padding: 1px 5px; border: 0px; font-size: 13px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, sans-serif; white-space: pre-wrap; background-color: #eeeeee;">app/src/main/jniLibs</code>&nbsp;instead of older&nbsp;<code style="margin: 0px; padding: 1px 5px; border: 0px; font-size: 13px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, sans-serif; white-space: pre-wrap; background-color: #eeeeee;">libs</code>&nbsp;folder. For those new to Android OpenCV, don't miss below steps</p><ul style="margin: 0px 0px 1em 30px; padding: 0px; border: 0px; font-size: 15px; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 19.5px; background-color: #ffffff;"><li style="margin: 0px 0px 0.5em; padding: 0px; border: 0px; word-wrap: break-word;">include&nbsp;<code style="margin: 0px; padding: 1px 5px; border: 0px; font-size: 13px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, sans-serif; white-space: pre-wrap; background-color: #eeeeee;">static{ System.loadLibrary("opencv_java"); }</code></li><li style="margin: 0px 0px 0.5em; padding: 0px; border: 0px; word-wrap: break-word;">For step(5), if you ignore any platform libs like x86, make sure your device/emulator is not on that platform.</li></ul><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; font-size: 15px; clear: both; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 19.5px; background-color: #ffffff;">OpenCV written is in C/C++. Java wrappers are</p><ol style="margin: 0px 0px 1em 30px; padding: 0px; border: 0px; font-size: 15px; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 19.5px; background-color: #ffffff;"><li style="margin: 0px 0px 0.5em; padding: 0px; border: 0px; word-wrap: break-word;"><strong style="margin: 0px; padding: 0px; border: 0px;"><a href="http://opencv.org/platforms/android.html" rel="nofollow" style="margin: 0px; padding: 0px; border: 0px; cursor: pointer; color: #0c65a5; text-decoration: none;">Android OpenCV SDK</a></strong>&nbsp;- OpenCV.org maintained Android Java wrapper. I suggest this one.</li><li style="margin: 0px 0px 0.5em; padding: 0px; border: 0px; word-wrap: break-word;"><strong style="margin: 0px; padding: 0px; border: 0px;"><a href="http://opencv.org/opencv-java-api.html" rel="nofollow" style="margin: 0px; padding: 0px; border: 0px; cursor: pointer; color: #0c65a5; text-decoration: none;">OpenCV Java</a></strong>&nbsp;- OpenCV.org maintained auto generated desktop Java wrapper.</li><li style="margin: 0px 0px 0.5em; padding: 0px; border: 0px; word-wrap: break-word;"><strong style="margin: 0px; padding: 0px; border: 0px;"><a href="https://github.com/bytedeco/javacv" rel="nofollow" style="margin: 0px; padding: 0px; border: 0px; cursor: pointer; color: #0c65a5; text-decoration: none;">JavaCV</a></strong>&nbsp;- Popular Java wrapper maintained by independent developer(s). Not Android specific. This library&nbsp;<em style="margin: 0px; padding: 0px; border: 0px;">might</em>&nbsp;get out of sync with OpenCV newer versions.</li></ol><img src ="http://www.cppblog.com/codejie/aggbug/210337.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/codejie/" target="_blank">codejie</a> 2015-04-14 23:54 <a href="http://www.cppblog.com/codejie/archive/2015/04/14/210337.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPRING : Handle JSON and Image object in One Request</title><link>http://www.cppblog.com/codejie/archive/2015/04/13/210331.html</link><dc:creator>codejie</dc:creator><author>codejie</author><pubDate>Mon, 13 Apr 2015 15:53:00 GMT</pubDate><guid>http://www.cppblog.com/codejie/archive/2015/04/13/210331.html</guid><wfw:comment>http://www.cppblog.com/codejie/comments/210331.html</wfw:comment><comments>http://www.cppblog.com/codejie/archive/2015/04/13/210331.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/codejie/comments/commentRss/210331.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/codejie/services/trackbacks/210331.html</trackback:ping><description><![CDATA[<br />&nbsp; &nbsp; 代码这里~<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp; &nbsp; @RequestMapping(value&nbsp;=&nbsp;"/req",&nbsp;method&nbsp;=&nbsp;RequestMethod.POST)<br />&nbsp;&nbsp;&nbsp;&nbsp;@ResponseBody<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;ResponseEntity&lt;Post.Response&gt;&nbsp;post(HttpServletRequest&nbsp;request)&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Post.Response&nbsp;resp&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Post.Request&nbsp;req&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;file&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CommonsMultipartResolver&nbsp;multipartResolver&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;CommonsMultipartResolver(request.getSession().getServletContext());&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(multipartResolver.isMultipart(request))&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MultipartHttpServletRequest&nbsp;multiRequest&nbsp;=&nbsp;(MultipartHttpServletRequest)&nbsp;request;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Collection&lt;Part&gt;&nbsp;parts&nbsp;=&nbsp;multiRequest.getParts();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;hasJSON&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;hasFile&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">final</span>&nbsp;Part&nbsp;p&nbsp;:&nbsp;parts)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(hasJSON)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">continue</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(p.getContentType().contains("application/json"))&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectMapper&nbsp;mapper&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ObjectMapper();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;req&nbsp;=&nbsp;mapper.readValue(p.getInputStream(),&nbsp;Post.Request.<span style="color: #0000FF; ">class</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(req&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resp&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Post.Response();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resp.setX(100);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hasJSON&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(p.getContentType().contains("image/jpeg"))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++&nbsp;index;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file&nbsp;=&nbsp;UPLOAD_ROOT&nbsp;+&nbsp;String.valueOf(index)&nbsp;+&nbsp;".jpg";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream&nbsp;is&nbsp;=&nbsp;p.getInputStream();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;localFile&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;File(file);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OutputStream&nbsp;os&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;FileOutputStream(localFile);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;bytesRead&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;buffer&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;<span style="color: #0000FF; ">byte</span>[8192];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;((bytesRead&nbsp;=&nbsp;is.read(buffer,&nbsp;0,&nbsp;8192))&nbsp;!=&nbsp;-1)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.write(buffer,&nbsp;0,&nbsp;bytesRead);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hasFile&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(hasJSON&nbsp;&amp;&amp;&nbsp;hasFile)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(IOException&nbsp;e1)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e1.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(ServletException&nbsp;e1)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e1.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(req&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>&nbsp;&amp;&amp;&nbsp;file&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resp&nbsp;=&nbsp;calc.calc(req,&nbsp;file);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(resp&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ResponseEntity&lt;Post.Response&gt;(resp,&nbsp;HttpStatus.OK);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ResponseEntity&lt;Post.Response&gt;(resp,&nbsp;HttpStatus.BAD_REQUEST);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}</div><img src ="http://www.cppblog.com/codejie/aggbug/210331.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/codejie/" target="_blank">codejie</a> 2015-04-13 23:53 <a href="http://www.cppblog.com/codejie/archive/2015/04/13/210331.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OpenCV : build with Maven on Spring</title><link>http://www.cppblog.com/codejie/archive/2015/03/24/210154.html</link><dc:creator>codejie</dc:creator><author>codejie</author><pubDate>Tue, 24 Mar 2015 14:13:00 GMT</pubDate><guid>http://www.cppblog.com/codejie/archive/2015/03/24/210154.html</guid><wfw:comment>http://www.cppblog.com/codejie/comments/210154.html</wfw:comment><comments>http://www.cppblog.com/codejie/archive/2015/03/24/210154.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/codejie/comments/commentRss/210154.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/codejie/services/trackbacks/210154.html</trackback:ping><description><![CDATA[<br />&nbsp; &nbsp; 为了赶时髦，准备把OpenCV的操作通过WebService的方式Deploy出去，因此做了如下的事情：<br /><br />&nbsp; &nbsp; 1. download<a href="http://opencv.org/"> opencv zip package</a>；<br />&nbsp; &nbsp; 2. download <a href="www.cmake.org/">cmake source zip</a>；<br />&nbsp; &nbsp; 3. download <a href="http://ant.apache.org/">ant binary package</a>；<br />&nbsp; &nbsp; 4. install ant binary;<br />&nbsp; &nbsp; 5. make cmake;<br />&nbsp; &nbsp; 6. unzip opencv;<br />&nbsp; &nbsp; 7. cmake opencv source;<br /><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><br />#mkdir&nbsp;build<br />#cd&nbsp;build<br />#cmake&nbsp;-D&nbsp;BUILD_SHARED_LIBS=OFF&nbsp;../<br />#make</div><br />&nbsp; &nbsp; 8. install opencv library into Maven;<br /><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->mvn&nbsp;install:install-file&nbsp;-Dfile=opencv-2411.jar&nbsp;-DgroupId=org.opencv&nbsp;-DartifaceId=opencv&nbsp;-Dversion=2.4.11&nbsp;-Dpackaging=jar</div><br />&nbsp; &nbsp; 9. update pom.xml to add openvn dependency;<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp; &nbsp;&nbsp;&lt;dependency&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;groupId&gt;org.opencv&lt;/groupId&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;artifactId&gt;opencv&lt;/artifactId&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;version&gt;2.4.11&lt;/version&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;systemPath&gt;/Users/Jie/Downloads/opencv-2.4.11/build/bin/opencv-2411.jar&lt;/systemPath&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;scope&gt;system&lt;/scope&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/dependency&gt;</div><br />&nbsp; &nbsp; 10. run webapp;<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->mvn&nbsp;spring-boot:run</div><br />&nbsp; &nbsp; 11. done;<br /><br />&nbsp; &nbsp; 翻了无数++的页面，就这些~<br /><img src ="http://www.cppblog.com/codejie/aggbug/210154.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/codejie/" target="_blank">codejie</a> 2015-03-24 22:13 <a href="http://www.cppblog.com/codejie/archive/2015/03/24/210154.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++: c++ wrap for libpq</title><link>http://www.cppblog.com/codejie/archive/2015/01/10/209453.html</link><dc:creator>codejie</dc:creator><author>codejie</author><pubDate>Fri, 09 Jan 2015 16:49:00 GMT</pubDate><guid>http://www.cppblog.com/codejie/archive/2015/01/10/209453.html</guid><wfw:comment>http://www.cppblog.com/codejie/comments/209453.html</wfw:comment><comments>http://www.cppblog.com/codejie/archive/2015/01/10/209453.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/codejie/comments/commentRss/209453.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/codejie/services/trackbacks/209453.html</trackback:ping><description><![CDATA[<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">class</span>&nbsp;DBConnection<br />{<br /><span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;TParams<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TParams(<span style="color: #0000FF; ">int</span>&nbsp;size);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;~TParams();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TParams(<span style="color: #0000FF; ">const</span>&nbsp;TParams&amp;&nbsp;<span style="color: #0000FF; ">params</span>)&nbsp;{}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TParams&amp;&nbsp;<span style="color: #0000FF; ">operator</span>&nbsp;=&nbsp;(<span style="color: #0000FF; ">const</span>&nbsp;TParams&amp;&nbsp;<span style="color: #0000FF; ">params</span>)&nbsp;{&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;*<span style="color: #0000FF; ">this</span>;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Add(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;val,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;size);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Add(<span style="color: #0000FF; ">int</span>&nbsp;val);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Add(unsigned&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;val);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Add(uint64_t&nbsp;val);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Add(<span style="color: #0000FF; ">short</span>&nbsp;val);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Free();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;Size()&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;{&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;_size;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;*&nbsp;Value()&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;{&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;value;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>*&nbsp;Length()&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;{&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;length;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>*&nbsp;Format()&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;{&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;format;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>**&nbsp;value;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>*&nbsp;length;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>*&nbsp;format;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;_size;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;_pos;<br />&nbsp;&nbsp;&nbsp;&nbsp;};<br /><span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;DBConnection()<br />&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;conn(NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;~DBConnection();<br /><span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;Connect(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;info);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Disconnect();<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;ExecCmd(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;cmd);<br />&nbsp;&nbsp;&nbsp;&nbsp;PGresult*&nbsp;ExecQuery(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;sql);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;ExecCmdWithParams(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;cmd,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;TParams&amp;&nbsp;<span style="color: #0000FF; ">params</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;PGresult*&nbsp;ExecQueryWithParams(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;sql,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;TParams&amp;&nbsp;<span style="color: #0000FF; ">params</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;BeginTranscation();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;EndTranscation();<br /><span style="color: #0000FF; ">private</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;PGconn*&nbsp;conn;<br />};</div><br /><br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->DBConnection::TParams::TParams(<span style="color: #0000FF; ">int</span>&nbsp;size)<br />:&nbsp;_size(size),&nbsp;_pos(0)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;value&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;<span style="color: #0000FF; ">char</span>*[_size];<br />&nbsp;&nbsp;&nbsp;&nbsp;length&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;<span style="color: #0000FF; ">int</span>[_size];<br />&nbsp;&nbsp;&nbsp;&nbsp;format&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;<span style="color: #0000FF; ">int</span>[_size];<br />}<br /><br />DBConnection::TParams::~TParams()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Free();<br />}<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;DBConnection::TParams::Free()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(_size&nbsp;==&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;_size;&nbsp;++&nbsp;i)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(format[i]&nbsp;==&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete[]&nbsp;value[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(length[i]&nbsp;==&nbsp;<span style="color: #0000FF; ">sizeof</span>(<span style="color: #0000FF; ">int</span>)&nbsp;||&nbsp;length[i]&nbsp;==&nbsp;<span style="color: #0000FF; ">sizeof</span>(unsigned&nbsp;<span style="color: #0000FF; ">int</span>))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;(<span style="color: #0000FF; ">int</span>*)value[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(length[i]&nbsp;==&nbsp;<span style="color: #0000FF; ">sizeof</span>(uint64_t))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;(uint64_t*)value[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;(<span style="color: #0000FF; ">short</span>*)value[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;delete[]&nbsp;value,&nbsp;value&nbsp;=&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;delete[]&nbsp;length,&nbsp;length&nbsp;=&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;delete[]&nbsp;format,&nbsp;format&nbsp;=&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;_size&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;DEBUG(DEBUG_ANY,&nbsp;"&lt;DBConnection::TParams::Free()&gt;"&lt;&lt;&nbsp;std::endl);<br />}<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;DBConnection::TParams::Add(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;val,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;size)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;char_val&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;<span style="color: #0000FF; ">char</span>[size&nbsp;+&nbsp;1];<br />&nbsp;&nbsp;&nbsp;&nbsp;char_val[size]&nbsp;=&nbsp;'\0';<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;char*&nbsp;char_val&nbsp;=&nbsp;new&nbsp;char[size];</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;memcpy(char_val,&nbsp;val,&nbsp;size);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;value[_pos]&nbsp;=&nbsp;char_val;<br />&nbsp;&nbsp;&nbsp;&nbsp;length[_pos]&nbsp;=&nbsp;size&nbsp;+&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;format[_pos]&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;++&nbsp;_pos;<br />}<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;DBConnection::TParams::Add(<span style="color: #0000FF; ">int</span>&nbsp;val)<br />{<br />#ifdef&nbsp;__OS_MAC__<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>*&nbsp;int_val&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;(<span style="color: #0000FF; ">int</span>)(val);<br /><span style="color: #0000FF; ">#else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>*&nbsp;int_val&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;(<span style="color: #0000FF; ">int</span>)(htonl(val));<br /><span style="color: #0000FF; ">#endif</span><br />&nbsp;&nbsp;&nbsp;&nbsp;value[_pos]&nbsp;=&nbsp;(<span style="color: #0000FF; ">char</span>*)(int_val);<br />&nbsp;&nbsp;&nbsp;&nbsp;length[_pos]&nbsp;=&nbsp;<span style="color: #0000FF; ">sizeof</span>(<span style="color: #0000FF; ">int</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;format[_pos]&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;++&nbsp;_pos;<br />}<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;DBConnection::TParams::Add(unsigned&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;val)<br />{<br />#ifdef&nbsp;__OS_MAC__<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;<span style="color: #0000FF; ">int</span>*&nbsp;int_val&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;(unsigned&nbsp;<span style="color: #0000FF; ">int</span>)(val);<br /><span style="color: #0000FF; ">#else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;<span style="color: #0000FF; ">int</span>*&nbsp;int_val&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;(unsigned&nbsp;<span style="color: #0000FF; ">int</span>)(htonl(val));<br /><span style="color: #0000FF; ">#endif</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;value[_pos]&nbsp;=&nbsp;(<span style="color: #0000FF; ">char</span>*)(int_val);<br />&nbsp;&nbsp;&nbsp;&nbsp;length[_pos]&nbsp;=&nbsp;<span style="color: #0000FF; ">sizeof</span>(<span style="color: #0000FF; ">int</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;format[_pos]&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;++&nbsp;_pos;<br />}<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;DBConnection::TParams::Add(uint64_t&nbsp;val)<br />{<br />#ifdef&nbsp;__OS_MAC__<br />&nbsp;&nbsp;&nbsp;&nbsp;uint64_t*&nbsp;uint64_val&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;uint64_t(val);<br /><span style="color: #0000FF; ">#else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;uint64_t*&nbsp;uint64_val&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;uint64_t(htobe64(val));<br /><span style="color: #0000FF; ">#endif</span><br />&nbsp;&nbsp;&nbsp;&nbsp;value[_pos]&nbsp;=&nbsp;(<span style="color: #0000FF; ">char</span>*)(uint64_val);<br />&nbsp;&nbsp;&nbsp;&nbsp;length[_pos]&nbsp;=&nbsp;<span style="color: #0000FF; ">sizeof</span>(uint64_t);<br />&nbsp;&nbsp;&nbsp;&nbsp;format[_pos]&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;++&nbsp;_pos;<br />}<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;DBConnection::TParams::Add(<span style="color: #0000FF; ">short</span>&nbsp;val)<br />{<br />#ifdef&nbsp;__OS_MAC__<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">short</span>*&nbsp;int_val&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;(<span style="color: #0000FF; ">short</span>)(val);<br /><span style="color: #0000FF; ">#else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">short</span>*&nbsp;int_val&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;(<span style="color: #0000FF; ">short</span>)(htons(val));<br /><span style="color: #0000FF; ">#endif</span><br />&nbsp;&nbsp;&nbsp;&nbsp;value[_pos]&nbsp;=&nbsp;(<span style="color: #0000FF; ">char</span>*)(int_val);<br />&nbsp;&nbsp;&nbsp;&nbsp;length[_pos]&nbsp;=&nbsp;<span style="color: #0000FF; ">sizeof</span>(<span style="color: #0000FF; ">short</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;format[_pos]&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;++&nbsp;_pos;<br />}<br /><br /><span style="color: #808080; ">///</span><span style="color: #008000; ">/</span><span style="color: #808080; "><br /></span><br />DBConnection::~DBConnection()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Disconnect();<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;DBConnection::Connect(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;info)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;conn&nbsp;=&nbsp;PQconnectdb(info);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(PQstatus(conn)&nbsp;!=&nbsp;CONNECTION_OK)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DEBUG(DEBUG_ANY,&nbsp;"PQ&nbsp;connection&nbsp;failed.");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PQfinish(conn);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;DBConnection::Disconnect()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(conn&nbsp;!=&nbsp;NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PQfinish(conn);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn&nbsp;=&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;DBConnection::ExecCmd(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;cmd)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;PGresult*&nbsp;res&nbsp;=&nbsp;PQexec(conn,&nbsp;cmd);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(PQresultStatus(res)&nbsp;!=&nbsp;PGRES_COMMAND_OK)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DEBUG(DEBUG_ANY,&nbsp;"&lt;DBConnection::ExecCmd&gt;&nbsp;failed&nbsp;-&nbsp;"&nbsp;&lt;&lt;&nbsp;cmd&nbsp;&lt;&lt;&nbsp;std::endl);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DEBUG(DEBUG_ANY,&nbsp;"DBConnection::ExecCmd&gt;&nbsp;error&nbsp;-&nbsp;"&nbsp;&lt;&lt;&nbsp;PQerrorMessage(conn)&nbsp;&lt;&lt;&nbsp;std::endl);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PQclear(res);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;ret&nbsp;=&nbsp;ntohl(*PQcmdTuples(res));</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;ret&nbsp;=&nbsp;*PQcmdTuples(res);<br />&nbsp;&nbsp;&nbsp;&nbsp;PQclear(res);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;ret;<br />}<br /><br />PGresult*&nbsp;DBConnection::ExecQuery(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;sql)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;PGresult*&nbsp;res&nbsp;=&nbsp;PQexec(conn,&nbsp;sql);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(PQresultStatus(res)&nbsp;!=&nbsp;PGRES_TUPLES_OK)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DEBUG(DEBUG_ANY,&nbsp;"&lt;DBConnection::ExecQuery&gt;&nbsp;failed&nbsp;-&nbsp;"&nbsp;&lt;&lt;&nbsp;sql&nbsp;&lt;&lt;&nbsp;std::endl);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DEBUG(DEBUG_ANY,&nbsp;"DBConnection::ExecQuery&gt;&nbsp;error&nbsp;-&nbsp;"&nbsp;&lt;&lt;&nbsp;PQerrorMessage(conn)&nbsp;&lt;&lt;&nbsp;std::endl);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PQclear(res);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;res;<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;DBConnection::ExecCmdWithParams(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;cmd,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;DBConnection::TParams&amp;&nbsp;<span style="color: #0000FF; ">params</span>)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;PGresult*&nbsp;res&nbsp;=&nbsp;PQexecParams(conn,&nbsp;cmd,&nbsp;<span style="color: #0000FF; ">params</span>.Size(),&nbsp;NULL,&nbsp;<span style="color: #0000FF; ">params</span>.Value(),&nbsp;<span style="color: #0000FF; ">params</span>.Length(),&nbsp;<span style="color: #0000FF; ">params</span>.Format(),&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(PQresultStatus(res)&nbsp;!=&nbsp;PGRES_COMMAND_OK)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DEBUG(DEBUG_ANY,&nbsp;"&lt;DBConnection::ExecCmdWithParams&gt;&nbsp;failed&nbsp;-&nbsp;"&nbsp;&lt;&lt;&nbsp;cmd&nbsp;&lt;&lt;&nbsp;std::endl);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DEBUG(DEBUG_ANY,&nbsp;"DBConnection::ExecCmdWithParams&gt;&nbsp;error&nbsp;-&nbsp;"&nbsp;&lt;&lt;&nbsp;PQerrorMessage(conn)&nbsp;&lt;&lt;&nbsp;std::endl);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PQclear(res);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;ret&nbsp;=&nbsp;ntohl(*PQcmdTuples(res));</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;ret&nbsp;=&nbsp;*PQcmdTuples(res);<br />&nbsp;&nbsp;&nbsp;&nbsp;PQclear(res);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;DEBUG(DEBUG_ANY,&nbsp;"&lt;DBConnection::ExecCmdWithParams&gt;&nbsp;succ&nbsp;-&nbsp;"&nbsp;&lt;&lt;&nbsp;cmd&nbsp;&lt;&lt;&nbsp;std::endl);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;ret;<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;</span><span style="color: #008000; "><br /></span>}<br /><br />PGresult*&nbsp;DBConnection::ExecQueryWithParams(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;sql,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;TParams&amp;&nbsp;<span style="color: #0000FF; ">params</span>)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;PGresult*&nbsp;res&nbsp;=&nbsp;PQexecParams(conn,&nbsp;sql,&nbsp;<span style="color: #0000FF; ">params</span>.Size(),&nbsp;NULL,&nbsp;<span style="color: #0000FF; ">params</span>.Value(),&nbsp;<span style="color: #0000FF; ">params</span>.Length(),&nbsp;<span style="color: #0000FF; ">params</span>.Format(),&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(PQresultStatus(res)&nbsp;!=&nbsp;PGRES_TUPLES_OK)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DEBUG(DEBUG_ANY,&nbsp;"&lt;DBConnection::ExecQueryWithParams&gt;&nbsp;failed&nbsp;-&nbsp;"&nbsp;&lt;&lt;&nbsp;sql&nbsp;&lt;&lt;&nbsp;std::endl);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DEBUG(DEBUG_ANY,&nbsp;"DBConnection::ExecQueryWithParams&gt;&nbsp;error&nbsp;-&nbsp;"&nbsp;&lt;&lt;&nbsp;PQerrorMessage(conn)&nbsp;&lt;&lt;&nbsp;std::endl);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PQclear(res);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;res;<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;DBConnection::BeginTranscation()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;ExecCmd("BEGIN");<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;DBConnection::EndTranscation()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;ExecCmd("END");<br />}</div><br /><br /><br /><br /><br /><img src ="http://www.cppblog.com/codejie/aggbug/209453.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/codejie/" target="_blank">codejie</a> 2015-01-10 00:49 <a href="http://www.cppblog.com/codejie/archive/2015/01/10/209453.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>How to mount Bootcamp disk again</title><link>http://www.cppblog.com/codejie/archive/2014/12/20/209263.html</link><dc:creator>codejie</dc:creator><author>codejie</author><pubDate>Sat, 20 Dec 2014 11:33:00 GMT</pubDate><guid>http://www.cppblog.com/codejie/archive/2014/12/20/209263.html</guid><wfw:comment>http://www.cppblog.com/codejie/comments/209263.html</wfw:comment><comments>http://www.cppblog.com/codejie/archive/2014/12/20/209263.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/codejie/comments/commentRss/209263.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/codejie/services/trackbacks/209263.html</trackback:ping><description><![CDATA[<br />&nbsp; &nbsp; <strong>(忘记说了 -- 此法有危险，记得备份所有资料。。。)</strong><br /><br />
&nbsp; &nbsp; OSX升级到10.10.1后，突然发现在OSX下看不到Bootcamp设备了。想来这半个月就用过三次Win8.1，而且也没做啥过分的操作，怎么就看不见了呢？<br />
&nbsp; &nbsp; 折腾一下午，还是没有搞定，但发现一片好文<a href="https://discussions.apple.com/thread/4871585">https://discussions.apple.com/thread/4871585</a>，其他提到的问题跟我这一样，很是欢喜。<br />
&nbsp; &nbsp; &#8220;<span style="color: #333333; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Helvetica, Arial, Verdana, sans-serif; font-size: 12px; line-height: 18px; background-color: #ffffff;">The problem is that the tool you used to resize the NTFS volume updated the MBR but didn't update the GPT. OS X only uses the GPT, and since the partition is invalid in the GPT, the NTFS volume doesn't mount. &#8221;<br /></span>
&nbsp; &nbsp; &nbsp;没看太明白，意思应该是MBR跟GPT不一致了。<br />
&nbsp; &nbsp; 下面是正常的gpt数据：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->Jies-MacBook-Pro:~&nbsp;Jie$&nbsp;sudo&nbsp;gpt&nbsp;-r&nbsp;-vv&nbsp;show&nbsp;disk0<br />gpt&nbsp;show:&nbsp;disk0:&nbsp;mediasize=1000204886016;&nbsp;sectorsize=512;&nbsp;blocks=1953525168<br />gpt&nbsp;show:&nbsp;disk0:&nbsp;Suspicious&nbsp;MBR&nbsp;at&nbsp;sector&nbsp;0<br />gpt&nbsp;show:&nbsp;disk0:&nbsp;Pri&nbsp;GPT&nbsp;at&nbsp;sector&nbsp;1<br />gpt&nbsp;show:&nbsp;disk0:&nbsp;Sec&nbsp;GPT&nbsp;at&nbsp;sector&nbsp;1953525167<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size&nbsp;&nbsp;index&nbsp;&nbsp;contents<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MBR<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pri&nbsp;GPT&nbsp;header<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;32&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pri&nbsp;GPT&nbsp;table<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;34&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;40&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;409600&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;GPT&nbsp;part&nbsp;-&nbsp;C12A7328-F81F-11D2-BA4B-00A0C93EC93B<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;409640&nbsp;&nbsp;1451847864&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;GPT&nbsp;part&nbsp;-&nbsp;48465300-0000-11AA-AA11-00306543ECAC<br />&nbsp;&nbsp;1452257504&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1269536&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;GPT&nbsp;part&nbsp;-&nbsp;426F6F74-0000-11AA-AA11-00306543ECAC<br />&nbsp;&nbsp;1453527040&nbsp;&nbsp;&nbsp;499996672&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4&nbsp;&nbsp;GPT&nbsp;part&nbsp;-&nbsp;EBD0A0A2-B9E5-4433-87C0-68B6B72699C7<br />&nbsp;&nbsp;1953523712&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1423&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;1953525135&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;32&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sec&nbsp;GPT&nbsp;table<br />&nbsp;&nbsp;1953525167&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sec&nbsp;GPT&nbsp;header</div><br />&nbsp; &nbsp; 这个是有问题的：（我自己的忘记记录了，这里是copy文章里面的）<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all">sudo&nbsp;gpt&nbsp;-r&nbsp;-vv&nbsp;show&nbsp;disk0&nbsp;<br />&nbsp;<br />gpt&nbsp;show:&nbsp;disk0:&nbsp;mediasize=500107862016;&nbsp;sectorsize=512;&nbsp;blocks=976773168<br />gpt&nbsp;show:&nbsp;disk0:&nbsp;Suspicious&nbsp;MBR&nbsp;at&nbsp;sector&nbsp;0<br />gpt&nbsp;show:&nbsp;disk0:&nbsp;Pri&nbsp;GPT&nbsp;at&nbsp;sector&nbsp;1<br />gpt&nbsp;show:&nbsp;disk0:&nbsp;Sec&nbsp;GPT&nbsp;at&nbsp;sector&nbsp;976773167<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size&nbsp;&nbsp;index&nbsp;&nbsp;contents<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MBR<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pri&nbsp;GPT&nbsp;header<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;32&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pri&nbsp;GPT&nbsp;table<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;34&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;40&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;409600&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;GPT&nbsp;part&nbsp;-&nbsp;C12A7328-F81F-11D2-BA4B-00A0C93EC93B<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;409640&nbsp;&nbsp;586340368&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;GPT&nbsp;part&nbsp;-&nbsp;48465300-0000-11AA-AA11-00306543ECAC<br />&nbsp;&nbsp;586750008&nbsp;&nbsp;&nbsp;&nbsp;1269536&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;GPT&nbsp;part&nbsp;-&nbsp;426F6F74-0000-11AA-AA11-00306543ECAC<br />&nbsp;&nbsp;588019544&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;168&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;588019712&nbsp;&nbsp;144130048&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4&nbsp;<br />&nbsp;&nbsp;732149760&nbsp;&nbsp;244623360&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4&nbsp;&nbsp;GPT&nbsp;part&nbsp;-&nbsp;EBD0A0A2-B9E5-4433-87C0-68B6B72699C7<br />&nbsp;&nbsp;976773120&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;15&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;976773135&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;32&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sec&nbsp;GPT&nbsp;table<br />&nbsp;&nbsp;976773167&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sec&nbsp;GPT&nbsp;header</div><br />&nbsp; &nbsp; 可以发现GPT数据不连续，导致系统无法正常mount分区。<br /><br />&nbsp; &nbsp; 问题是这样，但我搞不懂文章中的修复方式，望文兴叹了半天。忽然想起，既然是磁盘分区导致的问题，那重新分区该就好了。于是就干起来。。。<br />&nbsp; &nbsp; 当然我不能删除原来的Bootcamp，那上还有很多同学要的C#代码呢。所以呢，走个旁道 -- 用DiskUtil先从原来Machintosh HD分区再划分个小分区来，然后再删除掉这个小分区，这样系统就会重新刷新分区数据。<br />&nbsp; &nbsp; 系统重启, sudo mount -t ntfs /dev/disk0s4 /Volumes/BOOTCAMP, 于是我又看见了我的BOOTCAMP设备了。bingo，搞定了。。。<br /><br /><br />&lt;---- 回头再说的分割线 ----&gt;<br />&nbsp; &nbsp; 这段日子，很长的一段日子过去了，只是今天还是没心情做个说明，下次吧。。。可以说的 --- 我依然奋斗在敲字的第一线。<br /><br /><br /><br /><br /><img src ="http://www.cppblog.com/codejie/aggbug/209263.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/codejie/" target="_blank">codejie</a> 2014-12-20 19:33 <a href="http://www.cppblog.com/codejie/archive/2014/12/20/209263.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android DEV : Andriod Studio Shows 'Waiting for device.'</title><link>http://www.cppblog.com/codejie/archive/2014/06/30/207472.html</link><dc:creator>codejie</dc:creator><author>codejie</author><pubDate>Mon, 30 Jun 2014 10:23:00 GMT</pubDate><guid>http://www.cppblog.com/codejie/archive/2014/06/30/207472.html</guid><wfw:comment>http://www.cppblog.com/codejie/comments/207472.html</wfw:comment><comments>http://www.cppblog.com/codejie/archive/2014/06/30/207472.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/codejie/comments/commentRss/207472.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/codejie/services/trackbacks/207472.html</trackback:ping><description><![CDATA[<pre>&nbsp;</pre><pre>    昨天将Android Studio升级到0.8.1, 竟然没法执行App了~</pre><pre>    Run窗口中显示:</pre>
<blockquote>
<p>Waiting for device.<br>Target device: lge-nexus_4-0262fa6d9d51c2e8</p></blockquote>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Event Log窗口显示:</p>
<blockquote>
<p>NoSuchMethodError: com.android.builder.model.AndroidArtifact.getOutputs()Ljava/util/Collection;: com.android.builder.model.AndroidArtifact.getOutputs()Ljava/util/Collection;</p></blockquote>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 折腾了很久, 不得要领. 后来想起Android Studio是采用解压安装包, 并覆盖原有目录方式升级的, 那么可能会是某个文件存在'新旧冲突'的可能. 于是一个个检查文件的时间戳, 发现只要在Android Studio目录下删除下面'旧'文件, 重启即可.</p>
<blockquote>
<p>\android-studio\plugins\android\lib\builder-model-0.11.0.jar</p></blockquote>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 因为Android Studio 0.8.1的Gradle用的是0.12.+了..</p>
<blockquote>
<p>// Top-level build file where you can add configuration options common to all sub-projects/modules.</p>
<p>buildscript {<br>&nbsp;&nbsp;&nbsp; repositories {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mavenCentral()<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; dependencies {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; classpath 'com.android.tools.build:gradle:0.12.+'</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // NOTE: Do not place your application dependencies here; they belong<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // in the individual module build.gradle files<br>&nbsp;&nbsp;&nbsp; }<br>}</p>
<p>allprojects {<br>&nbsp;&nbsp;&nbsp; repositories {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mavenCentral()<br>&nbsp;&nbsp;&nbsp; }<br>}</p></blockquote>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;---- No Google Service ----&gt;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 唉, 何时Google Service才能畅快访问啊...</p><img src ="http://www.cppblog.com/codejie/aggbug/207472.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/codejie/" target="_blank">codejie</a> 2014-06-30 18:23 <a href="http://www.cppblog.com/codejie/archive/2014/06/30/207472.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LAC : Do you remember it?</title><link>http://www.cppblog.com/codejie/archive/2014/06/30/207463.html</link><dc:creator>codejie</dc:creator><author>codejie</author><pubDate>Mon, 30 Jun 2014 07:24:00 GMT</pubDate><guid>http://www.cppblog.com/codejie/archive/2014/06/30/207463.html</guid><wfw:comment>http://www.cppblog.com/codejie/comments/207463.html</wfw:comment><comments>http://www.cppblog.com/codejie/archive/2014/06/30/207463.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/codejie/comments/commentRss/207463.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/codejie/services/trackbacks/207463.html</trackback:ping><description><![CDATA[<p>&nbsp;</p> <p>&nbsp;&nbsp;&nbsp; 早上很意外地收到一个留言, 说是需要LAC (LingosHook Android Client)和数据文件. 不知大家是否还记得这个? LAC敲完发布都已经过去两年了, 怎么<a href="http://www.cppblog.com/codejie/archive/2012/08/30/164888.html">使用看这里</a>, 需要的就这里下载了.</p> <p>&nbsp;</p> <blockquote> <div style="white-space: normal; text-transform: none; word-spacing: 0px; color: rgb(34,34,34); font: 14px arial, sans-serif; letter-spacing: normal; background-color: rgb(255,255,255); text-indent: 0px; -webkit-text-stroke-width: 0px">c46.db3 - <a style="color: rgb(17,85,204)" href="http://1drv.ms/1r436SD" target="_blank"><u>http://1drv.ms/1r436SD</u></a></div> <div style="white-space: normal; text-transform: none; word-spacing: 0px; color: rgb(34,34,34); font: 14px arial, sans-serif; letter-spacing: normal; background-color: rgb(255,255,255); text-indent: 0px; -webkit-text-stroke-width: 0px">LAC.apk - <a style="color: rgb(17,85,204)" href="http://1drv.ms/VzfFso" target="_blank"><u>http://1drv.ms/VzfFso</u></a></div></blockquote> <p>&nbsp;&nbsp;&nbsp; 近段时间Google的服务都不可访问, 我把这两个文件重新传到OneDrive上了, 并随手把其中的广告给删了, 唉, 反正在Android上一点银子也见不到, 索性真需要的就拿去吧...</p> <p>&nbsp;</p> <p>&nbsp;&nbsp;&nbsp; 唉, 实际都忘记这个LAC了, 想想自己在Android也敲了三年半了, 应用, 游戏敲了几个, 但现在想换份跟Android相关的工作竟然无望, 各种阴差阳错导致总总失败, 看来转行还是不对地...</p><img src ="http://www.cppblog.com/codejie/aggbug/207463.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/codejie/" target="_blank">codejie</a> 2014-06-30 15:24 <a href="http://www.cppblog.com/codejie/archive/2014/06/30/207463.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android DEV : Show a window on Baidu Map</title><link>http://www.cppblog.com/codejie/archive/2014/06/18/207328.html</link><dc:creator>codejie</dc:creator><author>codejie</author><pubDate>Wed, 18 Jun 2014 12:22:00 GMT</pubDate><guid>http://www.cppblog.com/codejie/archive/2014/06/18/207328.html</guid><wfw:comment>http://www.cppblog.com/codejie/comments/207328.html</wfw:comment><comments>http://www.cppblog.com/codejie/archive/2014/06/18/207328.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/codejie/comments/commentRss/207328.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/codejie/services/trackbacks/207328.html</trackback:ping><description><![CDATA[<p>&nbsp;</p> <p>&nbsp;&nbsp;&nbsp; 周末同学说想弄个基于Baidu地图的应用, 于是就开始研究这个SDK来. 其中应用有个需求, 需要点击地图上的标记时, 显示一组按钮. 于是按照常规的作法失业了InfoWindow, 如下.</p> <div> <div><pre>    <span style="color: #008000">//panel is a view, some buttons in it.</span>
    <span style="color: #0000ff">final</span> InfoWindow iw = <span style="color: #0000ff">new</span> InfoWindow(panel, marker.getPosition(), <span style="color: #0000ff">null</span>);
    <span style="color: #008000">//getMap() return BaiduMap</span>
    activity.getMap().showInfoWindow(iw);</pre></div>
<div>&nbsp;</div></div>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 倒是不难, 但处理点击事件时发现有问题了. 根据文档, 此时显示出来的InfoWindow实际是View的Bitmap图片, 也就意味着根本没法区分View上的Buttons了, 更别说能处理Button的点击事件了. 怪不得, 文档中对于整个InfoWindow只有一个ClickListener, 还不含有View信息.</p>
<p>&nbsp;&nbsp;&nbsp; 这样只能"曲线救国"了, InfoWindow不能用, 那就直接在MapView中弹出个PopupWindow吧. (顺手敲打测试代码, 就记录用)</p>
<p>&nbsp;</p>
<p>
</p><div><pre>    <span style="color: #0000ff">final</span> View panel = UserPanel.make(activity);
    Point p = activity.getMap().getProjection().toScreenLocation(marker.getPosition());

    <span style="color: #0000ff">final</span> PopupWindow pw = <span style="color: #0000ff">new</span> PopupWindow(panel);
    pw.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
    pw.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
    pw.setFocusable(<span style="color: #0000ff">true</span>);
    pw.setOutsideTouchable(<span style="color: #0000ff">true</span>);
    <span style="color: #008000">//getMapView() return MapView, not BaiduMap any more</span>
    pw.showAtLocation(activity.getMapView(), Gravity.LEFT | Gravity.BOTTOM,p.x, p.y );

    <span style="color: #0000ff">final</span> Button btn = (Button) panel.findViewById(R.id.button2);
    btn.setOnClickListener(<span style="color: #0000ff">new</span> View.OnClickListener() {
        @Override
        <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> onClick(View view) {
            pw.dismiss();
        }
    });</pre></div><br />
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 搞定,人长个脑袋总是有用的... </p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 测试中发现个问题, 如果地图发生放缩, Window弹出的位置会不准确, 很是奇怪, 按理MapView发生变化时, 其Projection应该能够实时跟随变化的, 这个问题回头需要再看看.<br /><br />&nbsp; &nbsp; &lt;---- 回过头的分割线 ----&gt;<br />&nbsp; &nbsp; 位置不准确的问题是由于View和Screen坐标系不同, 以及MapView自身size共同影响的, 错怪了Projection了..</p><img src ="http://www.cppblog.com/codejie/aggbug/207328.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/codejie/" target="_blank">codejie</a> 2014-06-18 20:22 <a href="http://www.cppblog.com/codejie/archive/2014/06/18/207328.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>I;P : How to Hide System Key</title><link>http://www.cppblog.com/codejie/archive/2014/06/12/207268.html</link><dc:creator>codejie</dc:creator><author>codejie</author><pubDate>Thu, 12 Jun 2014 12:38:00 GMT</pubDate><guid>http://www.cppblog.com/codejie/archive/2014/06/12/207268.html</guid><wfw:comment>http://www.cppblog.com/codejie/comments/207268.html</wfw:comment><comments>http://www.cppblog.com/codejie/archive/2014/06/12/207268.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/codejie/comments/commentRss/207268.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/codejie/services/trackbacks/207268.html</trackback:ping><description><![CDATA[<p>&nbsp;</p> <p>&nbsp;&nbsp;&nbsp; 今天突然私信问'I;P怎么隐藏的系统虚拟键'的. 样子就如下图(对比).</p> <p>&nbsp;&nbsp;&nbsp; </p> <p><a href="http://images.cnitblog.com/blog/574946/201406/121733092492142.png"><img title="1" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="1" src="http://images.cnitblog.com/blog/574946/201406/121733095453585.png" width="354" height="214"></a><a href="http://images.cnitblog.com/blog/574946/201406/121733098271798.png"><img title="2" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="2" src="http://images.cnitblog.com/blog/574946/201406/121733100614026.png" width="351" height="213"></a></p> <p>&nbsp;</p> <p>&nbsp;&nbsp;&nbsp; 可以看到三个系统虚拟键变成三个极小的点了. 实际I;P并没有达到'隐藏'的效果, 这应该只能算是'弱化'. 原因吗, 开始我没搞定'隐藏', 后来想着如果真隐藏了, 用户怎么操作系统按钮啊? 所以, '弱化'对于I;P也就够了...这个一点不难, 在libgdx的AndroidApplication的OnCreate()中点击如下代码即可.</p> <p>&nbsp;</p> <div><pre>    public <span style="color: #0000ff">void</span> onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        AndroidApplicationConfiguration cfg = new AndroidApplicationConfiguration();
        cfg.useGL20 = false;
        
        <span style="color: #0000ff">if</span> (Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.HONEYCOMB) {
	        WindowManager.LayoutParams params = getWindow().getAttributes();
	        params.systemUiVisibility = <strong>View.SYSTEM_UI_FLAG_LOW_PROFILE | View.SYSTEM_UI_FLAG_FULLSCREEN</strong>;</pre><pre>	        getWindow().setAttributes(params);
        }
        
        initialize(new IPGame(setup, playService), cfg);
        
    }</pre></div><br>
<p>&nbsp;&nbsp;&nbsp; '豆瓣阅读'这个app做到了隐藏, 不知如何做到的, 因为根据Android官方文档上的内容看, 这个是不开放的. 很是奇怪, 回头再试试吧..</p><img src ="http://www.cppblog.com/codejie/aggbug/207268.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/codejie/" target="_blank">codejie</a> 2014-06-12 20:38 <a href="http://www.cppblog.com/codejie/archive/2014/06/12/207268.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android DEV : setOnClickListener() vs. android:onClick</title><link>http://www.cppblog.com/codejie/archive/2014/06/06/207213.html</link><dc:creator>codejie</dc:creator><author>codejie</author><pubDate>Fri, 06 Jun 2014 13:40:00 GMT</pubDate><guid>http://www.cppblog.com/codejie/archive/2014/06/06/207213.html</guid><wfw:comment>http://www.cppblog.com/codejie/comments/207213.html</wfw:comment><comments>http://www.cppblog.com/codejie/archive/2014/06/06/207213.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/codejie/comments/commentRss/207213.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/codejie/services/trackbacks/207213.html</trackback:ping><description><![CDATA[<p>&nbsp;</p> <p>&nbsp;&nbsp;&nbsp; 晚上查看一段资源xml文件时, 发现View竟然有个'android:onClick'属性...这太'震惊'了...</p> <p>&nbsp;&nbsp;&nbsp; 刚开始敲Android时, 就想过这个问题 -- android把资源文件用的如此灵活, 为啥View控件不能在资源文件中直接定义各类事件回调函数呢? 后来敲多了, 发现如果直接在资源文件中定义事件处理属性, 这会限制资源文件的使用, 像是同一份资源文件如果被两个不同的Activity使用, 那就必须各自写一个事件回调处理函数, 如果没有, 一旦事件被触发, 那就是异常啊; 另外, 如果资源文件被一个Fragment使用, 且在Fragment实现了事件处理函数, 那当Fragment加入到Activity后, 怕系统就找不到这个函数了. 因此, 觉得没有'android:onClick'这样的属性该是正常的, 后面也就没再想过这个了, 每次都很老实的使用View.setOnClickListener()了...</p> <p>&nbsp;&nbsp;&nbsp; 但, 现在这个属性竟然真是存在, 而且一直都在, 这太让我'崩溃'了...那感觉就像走在大街上, 突然看到有人在遛 --- 恐龙一样...</p> <p>&nbsp;</p> <p>&nbsp;&nbsp;&nbsp; 于是, 赶紧写了代码测试了下~</p> <div><pre>    &lt;Button
        android:id="<span style="color: #8b0000">@+id/button1</span>"
        android:layout_width="<span style="color: #8b0000">wrap_content</span>"
        android:layout_height="<span style="color: #8b0000">wrap_content</span>"
        android:onClick="<span style="color: #8b0000">onButtonClick</span>"
        android:text="<span style="color: #8b0000">Button</span>" /&gt;</pre></div>
<div>&nbsp;</div>
<div><pre>	public void onButtonClick(View view) {
		Log.d(Tag, "onButtonClick()");		
	}</pre></div><br>
<p>&nbsp;&nbsp;&nbsp; 果然好用...但突然想到, 如果这个跟View.setOnClickListener()共存时, 调用过程该是如何呢? </p>
<p>&nbsp;</p>
<div><pre>		Button btn = (Button) <span style="color: #0000ff">this</span>.findViewById(R.id.button1);
		btn.setOnClickListener(<span style="color: #0000ff">new</span> OnClickListener() {

			@Override
			<span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> onClick(View v) {
				Log.d(Tag, "<span style="color: #8b0000">onClickListener - onClick()</span>");
			}
			
		});</pre></div>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 测试结果是,OnClilckListener()中的onClick()会被调用, 而android:onClick定义的onButtonClick()完全被忽略了. <br></p>
<p>&nbsp;&nbsp;&nbsp; 就如前面提到的, 这种属性设置的方式有些缺陷, 还是使用setOnClickListener()比较可控靠谱, 当然如果在布局文件使用比较固定的情况下, 这种属性定义方式确实可以少敲很多代码.</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 基于测试结果, 突然'抖机灵'地想到一段代码来 -- 如果在onButtonClick()中调用setOnClickListener()会怎样呢?</p>
<p>&nbsp;</p>
<div><pre>	<span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> onButtonClick(View view) {
		Log.d(Tag, "<span style="color: #8b0000">onButtonClick()</span>");
		
		Button btn = (Button) <span style="color: #0000ff">this</span>.findViewById(R.id.button1);
		btn.setOnClickListener(<span style="color: #0000ff">new</span> OnClickListener() {

			@Override
			<span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> onClick(View v) {
				Log.d(Tag, "<span style="color: #8b0000">onClickListener - onClick()</span>");
			}
			
		});		
	}</pre></div>
<p><br>&nbsp;&nbsp;&nbsp; 这样第一次点击时, 执行onButtonCllick(), 并将View的点击事件处理通过setOnClickListener()传到OnClickListener()中, 当再次被点击时, 就会执行onClick()了. 这就可以实现一种需求 -- 点一次没事, 再点就崩溃...根本不用加什么判断变量和语句了, 嘿嘿, 多'机智'啊...</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&lt;---- 拖延症也会并发的分割线 ----&gt;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 近段时间, 各种借口导致各种拖延症并发, 使得SnakeGo敲的甚是缓慢..不表了...</p><img src ="http://www.cppblog.com/codejie/aggbug/207213.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/codejie/" target="_blank">codejie</a> 2014-06-06 21:40 <a href="http://www.cppblog.com/codejie/archive/2014/06/06/207213.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SnakeGo : Scaling Screen on Stage II</title><link>http://www.cppblog.com/codejie/archive/2014/05/21/207048.html</link><dc:creator>codejie</dc:creator><author>codejie</author><pubDate>Wed, 21 May 2014 15:59:00 GMT</pubDate><guid>http://www.cppblog.com/codejie/archive/2014/05/21/207048.html</guid><wfw:comment>http://www.cppblog.com/codejie/comments/207048.html</wfw:comment><comments>http://www.cppblog.com/codejie/archive/2014/05/21/207048.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/codejie/comments/commentRss/207048.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/codejie/services/trackbacks/207048.html</trackback:ping><description><![CDATA[<p>&nbsp;</p> <p>&nbsp;&nbsp;&nbsp; 昨晚把BaseScreen就敲好了, 也找到了屏幕放缩的最优和最简方式. 不多说, 看代码:</p> <div><pre>	<span style="color: #0000ff">public</span> BaseScreen(<span style="color: #0000ff">final</span> SnakeGo game) {
		<strong><span style="color: #0000ff">super</span>(<span style="color: #0000ff">new</span> ScalingViewport(Scaling.fit, CommonConsts.Screen.WIDTH, CommonConsts.Screen.HEIGHT, <span style="color: #0000ff">new</span> OrthographicCamera()), <span style="color: #0000ff">new</span> SpriteBatch());</strong>		

		<span style="color: #0000ff">this</span>.game = game;
		
		Gdx.input.setInputProcessor(<span style="color: #0000ff">this</span>);
	}</pre></div><br>
<p>&nbsp;&nbsp;&nbsp; BaseScreen直接继承与Stage是个好方法, 很方便使用Stage所提供的各种渲染/输入相关的函数, 但这样如果考虑MVC风格的话, M和C似乎就不该在Screen存在, 但却又没地方放置...当然这样可能有些死脑筋了. (我在Snake对象中分离了M和C).</p>
<p>&nbsp;&nbsp;&nbsp; 在构造函数中, 使用Scaling的fit方式来初始Stage, 可以保证屏幕'居中放缩', 并在resize()时, 更新尺寸即可.</p>
<div><pre>	@Override
	<span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> resize(<span style="color: #0000ff">int</span> width, <span style="color: #0000ff">int</span> height) {
		<strong><span style="color: #0000ff">this</span>.getViewport().update(width, height, <span style="color: #0000ff">true</span>);
</strong>	}</pre></div>
<p>&nbsp;&nbsp;&nbsp; 这方法有些简单的让人不敢相信...</p>
<p>&nbsp;</p>
<p>&lt;---- LIBGDX小众的分割线 ----&gt;</p>
<p>&nbsp;&nbsp;&nbsp; 这两天留意些Game相关的招聘信息, 发现Libgdx真是小众啊, 一个都没有, 难道真的像朋友说的 -- "也就你自己玩玩吧...".&nbsp; LIBGDX相对比较'潜', 用起来虽说有些'复杂', 但对于研究个'架构'什么的, 真的很不错的....唉, 难道我也转向cocos2d-x去?</p><img src ="http://www.cppblog.com/codejie/aggbug/207048.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/codejie/" target="_blank">codejie</a> 2014-05-21 23:59 <a href="http://www.cppblog.com/codejie/archive/2014/05/21/207048.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SnakeGo : Scaling Screen on Stage</title><link>http://www.cppblog.com/codejie/archive/2014/05/19/207024.html</link><dc:creator>codejie</dc:creator><author>codejie</author><pubDate>Mon, 19 May 2014 15:11:00 GMT</pubDate><guid>http://www.cppblog.com/codejie/archive/2014/05/19/207024.html</guid><wfw:comment>http://www.cppblog.com/codejie/comments/207024.html</wfw:comment><comments>http://www.cppblog.com/codejie/archive/2014/05/19/207024.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/codejie/comments/commentRss/207024.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/codejie/services/trackbacks/207024.html</trackback:ping><description><![CDATA[<p>&nbsp;</p> <p>&nbsp;&nbsp; 刚才使用LIBGDX的Stage时, 发现1.0.1跟0.99的一个变更 -- Stage内置Camera和Viewport(好用的ScalingViewport类). 如此这样, 那放缩屏幕更方便了...</p> <p>&nbsp;</p> <div><pre>	@Override
	<span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> resize(<span style="color: #0000ff">int</span> width, <span style="color: #0000ff">int</span> height) {
		
		Vector2 size = Scaling.fit.apply(CommonConsts.Screen.WIDTH, CommonConsts.Screen.HEIGHT, width, height);	
		<span style="color: #0000ff">this</span>.getViewport().update((<span style="color: #0000ff">int</span>)size.x, (<span style="color: #0000ff">int</span>)size.y, <span style="color: #0000ff">true</span>);</pre><pre>&nbsp;</pre><pre>//		Vector2 screenScaling = <span style="color: #0000ff">new</span> Vector2((size.x / CommonConsts.Screen.WIDTH), (size.y / CommonConsts.Screen.HEIGHT));
//		<span style="color: #0000ff">this</span>.getRoot().setScale(screenScaling.x, screenScaling.y);
	}</pre></div><br>
<p>&nbsp; <a href="http://www.cppblog.com/images/cppblog_com/codejie/Windows-Live-Writer/SnakeGo--Stage_14012/4_2.png"><img title="4" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="4" src="http://www.cppblog.com/images/cppblog_com/codejie/Windows-Live-Writer/SnakeGo--Stage_14012/4_thumb.png" width="255" height="155"></a><a href="http://www.cppblog.com/images/cppblog_com/codejie/Windows-Live-Writer/SnakeGo--Stage_14012/5_2.png"><img title="5" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="5" src="http://www.cppblog.com/images/cppblog_com/codejie/Windows-Live-Writer/SnakeGo--Stage_14012/5_thumb.png" width="244" height="404"></a></p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; Stage内置的Camera和Viewport把'原点'放在左下角, 而不是常使用的'居中', 另外这个还有个问题, 当屏幕缩放时, Viewport也不是一般习惯'居中'显示, 也是是靠左下. 我简单查看了下相应的Viewport类, 没有发现如何设置这个偏移量. 只是SnakeGo'竖屏'模式在N4上正好'铺满', 这个问题再说吧. 如果需要, 能预估最麻烦的就是重载ScalingViewport类了.</p>
<p>&nbsp;&nbsp;&nbsp; 代码中, 后面注释掉的两句是用于等比例放缩图形的, 还没认真算过, 似乎不需要也可以的, 需要再看看Viewport类..</p><img src ="http://www.cppblog.com/codejie/aggbug/207024.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/codejie/" target="_blank">codejie</a> 2014-05-19 23:11 <a href="http://www.cppblog.com/codejie/archive/2014/05/19/207024.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SnakeGo : Scaling Screen and Moving Camera</title><link>http://www.cppblog.com/codejie/archive/2014/05/18/207007.html</link><dc:creator>codejie</dc:creator><author>codejie</author><pubDate>Sun, 18 May 2014 11:24:00 GMT</pubDate><guid>http://www.cppblog.com/codejie/archive/2014/05/18/207007.html</guid><wfw:comment>http://www.cppblog.com/codejie/comments/207007.html</wfw:comment><comments>http://www.cppblog.com/codejie/archive/2014/05/18/207007.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/codejie/comments/commentRss/207007.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/codejie/services/trackbacks/207007.html</trackback:ping><description><![CDATA[<p>&nbsp;</p> <p>&nbsp;&nbsp;&nbsp; 敲了几晚SnakeGo, 原型出来了, 大家来看看不...</p> <p>&nbsp;</p> <p><img title="1" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="1" src="http://www.cppblog.com/images/cppblog_com/codejie/Windows-Live-Writer/SnakeGo-_13899/1_27d519d2-f888-44d1-9760-96312a8c4a58.png" width="240" height="400" /><img title="2" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="2" src="http://www.cppblog.com/images/cppblog_com/codejie/Windows-Live-Writer/SnakeGo-_13899/2_09279857-09bb-4f01-9660-67d0b3886a01.png" width="240" height="400" /><img title="3" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="3" src="http://www.cppblog.com/images/cppblog_com/codejie/Windows-Live-Writer/SnakeGo-_13899/3_e07439f6-6915-45bd-bc9b-6fea5a544b8b.png" width="240" height="400" /></p> <p>&nbsp;</p> <p>&nbsp;&nbsp;&nbsp; 不错, 这货就是---贪吃蛇...哈哈...别急, 这还是原型, 好玩的在后面呢...(以我敲字速度, 大约再等不到六个月应该可以完成了...)</p> <p>&nbsp;</p> <p>&nbsp;&nbsp;&nbsp; 今天这里记录下使用LIBGDX过程中碰到的两个问题:</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1. 调整屏幕比例;</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2. 移动观察镜头;</p> <p>&nbsp;</p> <p>一, 调整屏幕比例</p> <p>&nbsp;&nbsp;&nbsp; LIBGDX是跨平台的, 一大好处就是直接在PC上测试, 那是非常的方便, 但这有两个问题需要考虑, 一, 手机是1280x768, 但我PC只有1280x1024的, 而且真要开个跟手机一样大小的一样大小的屏幕, 那还怎么看log输出呢? 二就是不同的手机有着不同的分辨率, 长宽比也不一致, 那怎么保证图形不变形呢?</p> <p>&nbsp;&nbsp;&nbsp; 这个问题不难解决, 只需要在屏幕尺寸发生变化时, 即resize()(第一次启动也会调用此函数)中, 重新调整镜头(Camera)的参数即可. 如下代码:</p> <div><pre>	@Override
	<span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> resize(<span style="color: #0000ff">int</span> width, <span style="color: #0000ff">int</span> height) {
		Vector2 size = Scaling.fit.apply(WIDTH, HEIGHT, width, height);
		
		camera = <span style="color: #0000ff">new</span> OrthographicCamera(size.x, size.y);
		camera.update();

		batch.setProjectionMatrix(camera.combined);
	    
              <span style="color: #0000ff">int</span> viewportX = (<span style="color: #0000ff">int</span>)(width - size.x) / 2;
	       <span style="color: #0000ff">int</span> viewportY = (<span style="color: #0000ff">int</span>)(height - size.y) / 2;
	       <span style="color: #0000ff">int</span> viewportWidth = (<span style="color: #0000ff">int</span>)size.x;
	       <span style="color: #0000ff">int</span> viewportHeight = (<span style="color: #0000ff">int</span>)size.y;
	    
		Gdx.gl.glViewport(viewportX, viewportY, viewportWidth, viewportHeight);

		<span style="color: #0000ff">super</span>.resize(width, height);
	}</pre></div>
<p>&nbsp;&nbsp;&nbsp; 这里采用的是重新创建camera实例的方式, 另外用改变已有camera实例的参数方式也是一样的. 很简单, 而且这样一次就解决了上面两个问题 -- PC机上使用任何尺寸的窗口, 都可以获得跟设置等比例的窗口, 手机上亦是如此. 像<a href="http://www.cppblog.com/codejie/category/20828.html">I;P</a>就是采用的这种方式来保持其在任意手机上都是1280:768的比例.</p>
<p>&nbsp;&nbsp;&nbsp; 这种方法只是改变了'视图'的大小, 但并不会改变其中的图形的大小, 这样为了保持图形显示比例, 需要在输出图形时做相应的比例放缩. 可以在resize()获得这个比例, 染在图形输出时使用这个比例.</p>
<div><pre>              screenScaling = <span style="color: #0000ff">new</span> Vector2((size.x / WIDTH), (size.y / HEIGHT));</pre>
<div><pre>              ...
              ...
              batch.draw(img, (- WIDTH / 2) * screenScaling.x, (- HEIGHT / 2) * screenScaling.y, WIDTH * screenScaling.x, HEIGHT * screenScaling.y);</pre></div>
<div>&nbsp;</div></div>
<p>二, 移动观察镜头</p>
<p>&nbsp;&nbsp;&nbsp; 在SnakeGo中, 为了不让Snake'跑出'屏幕, 需要镜头camera跟Snake本身保持'同步'移动, 这样看起来Snake保持在屏幕的中间, 但其它Object是移动的. 根据'相对运行'原理, 使整个看起来像是Snake在Object中穿行. 所以, 移动camaera是必须的, 代码也简单, 如下:</p>
<div><pre>              ...
		<span style="color: #0000ff">final</span> OrthographicCamera camera = game.getCamera();
		camera.translate(0.0f, 32.0f, 0.0f);
		camera.update();
		game.getSpriteBatch().setProjectionMatrix(camera.combined);
              ...</pre></div><br />
<p>&nbsp;</p>
<p>&lt;----心烦意乱的分割线----&gt;</p>
<p>&nbsp;&nbsp;&nbsp; 这几天在找工作, 前面去面了一次, 其中没一个App或者Game的问题, 倒全是C++相关的, 登时就傻眼了...虽说咱也是C++'出身'的(不然Blog也不会在这里不是), 但也许真的是'老'了, 才三年不用C++,竟然忘记的只剩下个auto_ptr了...更悲剧的是咱用的C++98标准已经变成C++11了, auto_ptr变成smart_ptr了... </p>
<p>&nbsp;&nbsp;&nbsp; 都说现在是个'跨界'的时代, 但咱这还没有跨界, 只是同行转个方向而已, 为啥就这么悲剧了...好吧, 估计学艺不精才是根本...</p>
<p>&nbsp;&nbsp;&nbsp; 同学"'大数据'的博士"周五来电, 问我要不要跟她一起做个'图像搜索', 有些犹豫, 要说三年前, 也许就干了, 但现在...再转次嘛...</p>
<p>&nbsp;&nbsp;&nbsp; 恰逢I;P敲完, 心烦意乱的一周, 只好赶紧抓起SnakeGo来, 夜夜疯敲, 来安抚砰砰躁动的心...是的, 至少敲字可以让自己平静些...</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 吐槽而已, 这里想说 ---- 程序员们啊, 转行要趁着年轻赶紧啊...</p><img src ="http://www.cppblog.com/codejie/aggbug/207007.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/codejie/" target="_blank">codejie</a> 2014-05-18 19:24 <a href="http://www.cppblog.com/codejie/archive/2014/05/18/207007.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>I;P : Classes Diagram</title><link>http://www.cppblog.com/codejie/archive/2014/05/14/206962.html</link><dc:creator>codejie</dc:creator><author>codejie</author><pubDate>Wed, 14 May 2014 12:36:00 GMT</pubDate><guid>http://www.cppblog.com/codejie/archive/2014/05/14/206962.html</guid><wfw:comment>http://www.cppblog.com/codejie/comments/206962.html</wfw:comment><comments>http://www.cppblog.com/codejie/archive/2014/05/14/206962.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/codejie/comments/commentRss/206962.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/codejie/services/trackbacks/206962.html</trackback:ping><description><![CDATA[<p>&nbsp;</p> <p>&nbsp;&nbsp;&nbsp; SnakeGo的基本模样在脑袋中勾画的差不多了, 现在需要放到'屏幕'上画个原型出来了, 但突然就忘记该怎么用libgdx框架来画了...</p> <p>&nbsp;&nbsp;&nbsp; 敲完I;P这才几天啊...赶紧打开工程再看, 就想起以前跟人说过 -- "<strong>libgdx不能叫'引擎', 顶多是一个'类堆'</strong>", 是啊, libgdx似乎就没个固定的架子嘛... 使用中, 用起libgdx来真的是要东拿西凑, 按照其中各类的功能, 自己来搭建自己的框架... 于是, 趁着脑袋还热, 赶紧画了下面的类图, 省的又忘记...</p> <p>&nbsp;</p> <p><a href="http://images.cnitblog.com/blog/574946/201405/141826071405041.png"><img title="classes" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; display: block; padding-right: 0px; border-top-width: 0px; margin-right: auto" border="0" alt="classes" src="http://images.cnitblog.com/blog/574946/201405/141826077033912.png" width="595" height="403"></a></p> <p>&nbsp;&nbsp;&nbsp; </p> <p>&nbsp;&nbsp;&nbsp; 如何, 乱不? </p> <p>&nbsp;&nbsp;&nbsp; BaseScreen用到的ScreenCanvas和ActorStage功能是相同的, 只是前者用于放置Sprite, 而后者用于放置Actor/Group; 简单说, ScreenCanvas里面放的是'背景图/贴图', 而ActorStage放置是可以响应Touch的Actors.</p> <p>&nbsp;&nbsp;&nbsp; Screen下面的Manager和Render在每个Screen实例里面都有一套的, 前者用于存放和处理'数据', 而Render则根据前者的数据来渲染界面, 两种之间通过相互注册的Listener来交换数据和事件. 这架子像不像MVC风格? 嘿嘿...</p><img src ="http://www.cppblog.com/codejie/aggbug/206962.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/codejie/" target="_blank">codejie</a> 2014-05-14 20:36 <a href="http://www.cppblog.com/codejie/archive/2014/05/14/206962.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>随笔 : Do you remember Turbo Basic?</title><link>http://www.cppblog.com/codejie/archive/2014/05/13/206952.html</link><dc:creator>codejie</dc:creator><author>codejie</author><pubDate>Tue, 13 May 2014 15:29:00 GMT</pubDate><guid>http://www.cppblog.com/codejie/archive/2014/05/13/206952.html</guid><wfw:comment>http://www.cppblog.com/codejie/comments/206952.html</wfw:comment><comments>http://www.cppblog.com/codejie/archive/2014/05/13/206952.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/codejie/comments/commentRss/206952.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/codejie/services/trackbacks/206952.html</trackback:ping><description><![CDATA[<p>&nbsp;</p> <p>&nbsp;&nbsp;&nbsp; 老爷子心不老, 依然在勤勤恳恳地敲着书和代码...没错, 就是source code. 像老爷子这样的老一辈会用电脑的都不多, 而我亲爱的老爷子那是会Turbo Basic的顶尖高手啊...每次想到这个, 内心都倍感自豪...</p> <p>&nbsp;&nbsp;&nbsp; 当年的"窗口"编程极其繁琐, 如果不看看那一套&lt;Win32 API大全&gt;, 再加上个&lt;Visual C++技术内幕&gt;, 都不保证能敲个Window出来, 什么HWND, hInstance, 以及乱七八糟的各类窗口和消息的struct...反正我是早早就忘光光了...想想现在在的Android上弄个"窗口"出来, 那,那真是"太小儿科"了...</p> <p>&nbsp;&nbsp;&nbsp; 呃, 跑远了...我意思是 ---- 老爷子止步于Windows编程, 各类代码全部运行在DOS下. 随着Windows的不断改进, 终于, Windows下再也不能运行老爸手中的无敌神器 -- Turbo Basic了...</p> <p>&nbsp;&nbsp;&nbsp; 曾跟老爷子说过, 将他的代码都移至到Android上, 但老爷子不同意, 因为, 他老人家还要改些参数的, 改些参数, 些参数, 参数...看着老爷子在Win7上装个VM跑XP再打开Command窗口运行Turbo Basic, 甚是辛苦. 作为知原理, 会Google的程序员我来说, 帮老爷子弄个DOS虚拟环境来跑TB.EXE, 那是必须的...</p> <p>&nbsp;&nbsp;&nbsp; 于是就有了下面的截图.</p> <p>&nbsp;</p> <p><img title="dos" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; float: left; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="dos" align="left" src="http://www.cppblog.com/images/cppblog_com/codejie/Windows-Live-Writer/--Do-you-remember-Turbo-Basic_1430F/dos_7b309b75-e548-4f42-9074-4736d3863e5f.png" width="441" height="298">&nbsp;<img title="tb" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="tb" src="http://www.cppblog.com/images/cppblog_com/codejie/Windows-Live-Writer/--Do-you-remember-Turbo-Basic_1430F/tb_b8f6ea6d-a331-4016-9c36-82af73b35804.png" width="442" height="296"></p> <p>&nbsp;</p> <p>&nbsp;&nbsp; <strong><a href="http://www.dosbox.com/">DosBox</a></strong></p><img src ="http://www.cppblog.com/codejie/aggbug/206952.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/codejie/" target="_blank">codejie</a> 2014-05-13 23:29 <a href="http://www.cppblog.com/codejie/archive/2014/05/13/206952.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>