﻿<?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++博客-庸人自扰-随笔分类-java</title><link>http://www.cppblog.com/wmuu/category/1631.html</link><description>含笑半步癫是用蜂蜜、川贝、桔梗、加上天山雪莲配制而成，不需冷藏，也没有防腐剂，除了毒性猛烈之外，味道还很好吃！而吃了含笑半步癫的朋友，顾名思义绝对不能走半步路或是面露笑容，否则也会全身爆炸而死。实在是居家旅行，杀人灭口，必备良药！
</description><language>zh-cn</language><lastBuildDate>Wed, 21 May 2008 16:40:46 GMT</lastBuildDate><pubDate>Wed, 21 May 2008 16:40:46 GMT</pubDate><ttl>60</ttl><item><title>jni试用资料</title><link>http://www.cppblog.com/wmuu/archive/2008/01/05/40462.html</link><dc:creator>含笑半步癫</dc:creator><author>含笑半步癫</author><pubDate>Sat, 05 Jan 2008 08:17:00 GMT</pubDate><guid>http://www.cppblog.com/wmuu/archive/2008/01/05/40462.html</guid><wfw:comment>http://www.cppblog.com/wmuu/comments/40462.html</wfw:comment><comments>http://www.cppblog.com/wmuu/archive/2008/01/05/40462.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wmuu/comments/commentRss/40462.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wmuu/services/trackbacks/40462.html</trackback:ping><description><![CDATA[<br><br><br>编译HelloWorld类<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span>&nbsp;<span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;HelloWorld&nbsp;{<br></span><span style="COLOR: #008080">&nbsp;2</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">native</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;displayHelloWorld();<br></span><span style="COLOR: #008080">&nbsp;3</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;4</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">native</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;printxx(String&nbsp;str);<br></span><span style="COLOR: #008080">&nbsp;5</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;6</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;{<br></span><span style="COLOR: #008080">&nbsp;7</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.loadLibrary(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">hello</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">&nbsp;8</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;System.load("hello");</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;9</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">10</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">11</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;{<br></span><span style="COLOR: #008080">12</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HelloWorld&nbsp;hw&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;HelloWorld();<br></span><span style="COLOR: #008080">13</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hw.displayHelloWorld();<br></span><span style="COLOR: #008080">14</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;;&nbsp;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">i)&nbsp;{<br></span><span style="COLOR: #008080">15</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hw<br></span><span style="COLOR: #008080">16</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.printxx(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">wo&nbsp;kaowo&nbsp;kaowo&nbsp;kaowo&nbsp;kaowo&nbsp;kaowo&nbsp;kaowo&nbsp;kaowo&nbsp;kaowo&nbsp;kaowo&nbsp;kaowo&nbsp;kao</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">17</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(i&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1000</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)&nbsp;{<br></span><span style="COLOR: #008080">18</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000">&nbsp;{<br></span><span style="COLOR: #008080">19</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">20</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">&nbsp;(InterruptedException&nbsp;e)&nbsp;{<br></span><span style="COLOR: #008080">21</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">22</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">23</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">24</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">25</span>&nbsp;<span style="COLOR: #000000">}</span></div>
<br>对编译完的class执行<br>javah HelloWorld<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span>&nbsp;<span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;DO&nbsp;NOT&nbsp;EDIT&nbsp;THIS&nbsp;FILE&nbsp;-&nbsp;it&nbsp;is&nbsp;machine&nbsp;generated&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;2</span>&nbsp;<span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">jni.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;3</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;Header&nbsp;for&nbsp;class&nbsp;HelloWorld&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;4</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;5</span>&nbsp;<span style="COLOR: #000000">#ifndef&nbsp;_Included_HelloWorld<br></span><span style="COLOR: #008080">&nbsp;6</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;_Included_HelloWorld</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;7</span>&nbsp;<span style="COLOR: #000000">#ifdef&nbsp;__cplusplus<br></span><span style="COLOR: #008080">&nbsp;8</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">extern</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">C</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;{<br></span><span style="COLOR: #008080">&nbsp;9</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">#endif</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">10</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">11</span>&nbsp;<span style="COLOR: #008000">&nbsp;*&nbsp;Class:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HelloWorld<br></span><span style="COLOR: #008080">12</span>&nbsp;<span style="COLOR: #008000">&nbsp;*&nbsp;Method:&nbsp;&nbsp;&nbsp;&nbsp;displayHelloWorld<br></span><span style="COLOR: #008080">13</span>&nbsp;<span style="COLOR: #008000">&nbsp;*&nbsp;Signature:&nbsp;()V<br></span><span style="COLOR: #008080">14</span>&nbsp;<span style="COLOR: #008000">&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">15</span>&nbsp;<span style="COLOR: #000000">JNIEXPORT&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;JNICALL&nbsp;Java_HelloWorld_displayHelloWorld<br></span><span style="COLOR: #008080">16</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;(JNIEnv&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">,&nbsp;jobject);<br></span><span style="COLOR: #008080">17</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">18</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">19</span>&nbsp;<span style="COLOR: #008000">&nbsp;*&nbsp;Class:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HelloWorld<br></span><span style="COLOR: #008080">20</span>&nbsp;<span style="COLOR: #008000">&nbsp;*&nbsp;Method:&nbsp;&nbsp;&nbsp;&nbsp;printxx<br></span><span style="COLOR: #008080">21</span>&nbsp;<span style="COLOR: #008000">&nbsp;*&nbsp;Signature:&nbsp;(Ljava/lang/String;)V<br></span><span style="COLOR: #008080">22</span>&nbsp;<span style="COLOR: #008000">&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">23</span>&nbsp;<span style="COLOR: #000000">JNIEXPORT&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;JNICALL&nbsp;Java_HelloWorld_printxx<br></span><span style="COLOR: #008080">24</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;(JNIEnv&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">,&nbsp;jobject,&nbsp;jstring);<br></span><span style="COLOR: #008080">25</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">26</span>&nbsp;<span style="COLOR: #000000">#ifdef&nbsp;__cplusplus<br></span><span style="COLOR: #008080">27</span>&nbsp;<span style="COLOR: #000000">}<br></span><span style="COLOR: #008080">28</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">#endif</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">29</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">#endif</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">30</span>&nbsp;<span style="COLOR: #000000"></span></div>
<br>编译<br>cl -I%java_home%\include -I%java_home%\include\win32 -LDHelloWorld.c -Fehello.dll<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span>&nbsp;<span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">jni.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;2</span>&nbsp;<span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">HelloWorld.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;3</span>&nbsp;<span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;4</span>&nbsp;<span style="COLOR: #000000">JNIEXPORT&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;JNICALL&nbsp;Java_HelloWorld_displayHelloWorld(JNIEnv&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">env,&nbsp;jobject&nbsp;obj)<br></span><span style="COLOR: #008080">&nbsp;5</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;6</span>&nbsp;<span style="COLOR: #000000">printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Hello&nbsp;world!\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;<br></span><span style="COLOR: #008080">&nbsp;7</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;8</span>&nbsp;<span style="COLOR: #000000">}<br></span><span style="COLOR: #008080">&nbsp;9</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">10</span>&nbsp;<span style="COLOR: #000000">JNIEXPORT&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;JNICALL&nbsp;Java_HelloWorld_printxx<br></span><span style="COLOR: #008080">11</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;(JNIEnv&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">env,&nbsp;jobject&nbsp;obj,&nbsp;jstring&nbsp;prompt){<br></span><span style="COLOR: #008080">12</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">13</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">str&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">env)</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">GetStringUTFChars(env,&nbsp;prompt,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">14</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%s</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,prompt);<br></span><span style="COLOR: #008080">15</span>&nbsp;<span style="COLOR: #000000">(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">env)</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">ReleaseStringUTFChars(env,&nbsp;prompt,&nbsp;str);<br></span><span style="COLOR: #008080">16</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;<br></span><span style="COLOR: #008080">17</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">18</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">19</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;<br></span><span style="COLOR: #008080">20</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;</span></div>
<br><br><br><br><strong>3．Java类型和本地类型对应<br></strong>　　<br>　　在如下情况下，需要在本地方法中应用java对象的引用，就会用到类型之间的转换：<br>　　<br>　　1）java方法里面将参数传入本地方法；<br>　　<br>　　2）在本地方法里面创建java对象；<br>　　<br>　　3）在本地方法里面return结果给java程序。<br>　　<br>　　分为如下两种情况：<br>　　<br>　　Java原始类型<br>　　<br>　　像booleans、integers、floats等从Java程序中传到本地方法中的原始类型可以直接使用，下面是java中的原始类型和本地方法中的类型的对应：<br>　　<br>　　Java类型　　本地类型　　字节(bit)<br>　　<br>　　boolean　　 jboolean　　 8, unsigned<br>　　byte　　　　jbyte　　　　8<br>　　char　　　　jchar　　　　16, unsigned<br>　　short　　　 jshort　　　 16<br>　　int　　　　 jint　　　　 32<br>　　long　　　　jlong　　　　64<br>　　float　　　 jfloat　　　 32<br>　　double　　　jdouble　　　64<br>　　void　　　　void　　　　 n/a<br>　　<br>　　也就是说如果我在方法中传进去了一个boolean的参数的话，那么我在本地方法中就有jboolean类型与之对应。同理，如果在本地方法中return一个jint的话，那么在java中就返回一个int类型。 <font color=#ffffff>中国网管论坛</font> <br>　　<br>　　Java对象<br>　　<br>　　Java对象做为引用被传递到本地方法中，所有这些Java对象的引用都有一个共同的父类型jobject(相当于java中的Object类是所有类的父类一样)。下面是JNI实现的一些jobject的子类：<br>　　<br>　　<strong>4．本地方法中访问java程序中的内容</strong><br>　　<br>　　1)访问String对象：<br>　　<br>　　从java程序中传过去的String对象在本地方法中对应的是jstring类型，jstring类型和c中的char*不同，所以如果你直接当做char*使用的话，就会出错。因此在使用之前需要将jstring转换成为c/c++中的char*，这里使用JNIEnv的方法转换。下面是一个例子：<br>　　<br>　　代码3：<br>　　<br>　　JNIEXPORT jstring JNICALL Java_Prompt_getLine<br>　　(JNIEnv *env, jobject obj, jstring prompt)<br>　　{<br>　　char buf[128];<br>　　const char *str = (*env)-&gt;GetStringUTFChars(env, prompt, 0);<br>　　printf("%s", str);<br>　　(*env)-&gt;ReleaseStringUTFChars(env, prompt, str);<br>　　<br>　　这里使用GetStringUTFChars方法将传进来的prompt（jstring类型）转换成为UTF－8的格式，就能够在本地方法中使用了。<br>　　<br>　　注意：在使用完你所转换之后的对象之后，需要显示调用ReleaseStringUTFChars方法，让JVM释放转换成UTF-8的string的对象的空间，如果不显示的调用的话，JVM中会一直保存该对象，不会被垃圾回收器回收，因此就会导致内存溢出。
<p class=Twe825>www.bitsCN.com</p>
<br>　　<br>　　下面是访问String的一些方法：<br>　　<br>　　◆GetStringUTFChars将jstring转换成为UTF-8格式的char*<br>　　<br>　　◆GetStringChars将jstring转换成为Unicode格式的char*<br>　　<br>　　◆ReleaseStringUTFChars释放指向UTF-8格式的char*的指针<br>　　<br>　　◆ReleaseStringChars释放指向Unicode格式的char*的指针<br>　　<br>　　◆NewStringUTF创建一个UTF-8格式的String对象<br>　　<br>　　◆NewString创建一个Unicode格式的String对象<br>　　<br>　　◆GetStringUTFLengt获取UTF-8格式的char*的长度<br>　　<br>　　◆GetStringLength获取Unicode格式的char*的长度<br>　　<br>　　2) 访问Array对象：<br>　　<br>　　和String对象一样，在本地方法中不能直接访问jarray对象，而是使用JNIEnv指针指向的一些方法来是用。<br>　　<br>　　访问Java原始类型数组：<br>　　<br>　　1）获取数组的长度：<br>　　<br>　　代码4：<br>　　<br>　　JNIEXPORT jint JNICALL Java_IntArray_sumArray<br>　　(JNIEnv *env, jobject obj, jintArray arr)<br>　　{<br>　　int i, sum = 0;<br>　　jsize len = (*env)-&gt;GetArrayLength(env, arr);<br>　　<br>　　如代码4所示，这里获取数组的长度和普通的c语言中的获取数组长度不一样，这里使用JNIEvn的一个函数GetArrayLength。
<div class=Twe825>bitsCN_com</div>
<br>　　<br>　　2）获取一个指向数组元素的指针：<br>　　<br>　　代码4：<br>　　<br>　　jint *body = (*env)-&gt;GetIntArrayElements(env, arr, 0);<br>　　<br>　　使用GetIntArrayElements方法获取指向arr数组元素的指针，注意该函数的参数，第一个是JNIEnv，第二个是数组，第三个是数组里面第三个是数组里面开始的元素<br>　　<br>　　3）使用指针取出Array中的元素<br>　　<br>　　代码5：<br>　　<br>　　for (i=0; i&lt;len; i++) {<br>　　sum += body[i];<br>　　}<br>　　<br>　　这里使用就和普通的c中的数组使用没有什么不同了<br>　　<br>　　4）释放数组元素的引用<br>　　<br>　　代码6：<br>　　<br>　　(*env)-&gt;ReleaseIntArrayElements(env, arr, body, 0);<br>　　<br>　　和操作String中的释放String的引用是一样的，提醒JVM回收arr数组元素的引用。<br>　　<br>　　这里举的例子是使用int数组的，同样还有boolean、float等对应的数组。<br>　　<br>　　获取数组元素指针的对应关系：<br>　　<br>　　函数　　　　　　　　　　　　数组类型<br>　　<br>　　GetBooleanArrayElements　　 boolean<br>　　GetByteArrayElements　　　　byte<br>　　GetCharArrayElements　　　　char <span class=Twe825>bitsCN.nET中国网管博客</span> <br>　　GetShortArrayElements　　　 short<br>　　GetIntArrayElements　　　　 int<br>　　GetLongArrayElements　　　　long<br>　　GetFloatArrayElements　　　 float<br>　　GetDoubleArrayElements　　　double<br>　　<br>　　释放数组元素指针的对应关系：<br>　　Function　　　　　　　　　　　　Array Type<br>　　ReleaseBooleanArrayElements　　 boolean<br>　　ReleaseByteArrayElements　　　　byte<br>　　ReleaseCharArrayElements　　　　char<br>　　ReleaseShortArrayElements　　　 short<br>　　ReleaseIntArrayElements　　　　 int<br>　　ReleaseLongArrayElements　　　　long<br>　　ReleaseFloatArrayElements　　　 float<br>　　ReleaseDoubleArrayElements　　　double<br>　　<br>　　访问自定义Java对象数组<br>　　<br>　　The JNI provides a separate set of functions to access elements of object arrays. You can use these functions to get and set individual object array elements.<br>　　<br>　　Note:　You cannot get all the object array elements at once.<br>　　<br>　　GetObjectArrayElement returns the object element at a given index.
<div class=Twe825>www_bitscn_com</div>
<br>　　<br>　　SetObjectArrayElement updates the object element at a given index.<br>　　<br>　　3) 访问Java对象的方法：<br>　　<br>　　在本地方法中调用Java对象的方法的步骤：<br>　　<br>　　①.获取你需要访问的Java对象的类：<br>　　<br>　　jclass cls = (*env)-&gt;GetObjectClass(env, obj);<br>　　<br>　　使用GetObjectClass方法获取obj对应的jclass。<br>　　<br>　　②.获取MethodID：<br>　　<br>　　jmethodID mid = (*env)-&gt;GetMethodID(env, cls, "callback", "(I)V");<br>　　<br>　　使用GetMethdoID方法获取你要使用的方法的MethdoID。其参数的意义：<br>　　<br>　　env??&gt;JNIEnv<br>　　<br>　　cls??&gt;第一步获取的jclass<br>　　<br>　　"callback"??&gt;要调用的方法名<br>　　<br>　　"(I)V"??&gt;方法的Signature<br>　　<br>　　③.调用方法：<br>　　<br>　　(*env)-&gt;CallVoidMethod(env, obj, mid, depth);<br>　　<br>　　使用CallVoidMethod方法调用方法。参数的意义：<br>　　<br>　　env??&gt;JNIEnv<br>　　<br>　　obj??&gt;通过本地方法穿过来的jobject<br>　　<br>　　mid??&gt;要调用的MethodID（即第二步获得的MethodID）<br>　　<br>　　depth??&gt;方法需要的参数（对应方法的需求，添加相应的参数） <font color=#ffffff>bitsCN.nET中国网管博客</font> <br>　　<br>　　注：这里使用的是CallVoidMethod方法调用，因为没有返回值，如果有返回值的话使用对应的方法，在后面会提到。<br>　　<br>　　方法的Signature<br>　　<br>　　方法的Signature是由方法的参数和返回值的类型共同构成的，下面是他们的结构：<br>　　<br>　　"(argument-types)return-type"<br>　　<br>　　其中Java程序中参数类型和其对应的值如下：<br>　　<br>　　Signature　　Java中的类型<br>　　Z　　　　　　　boolean<br>　　B　　　　　　　byte<br>　　C　　　　　　　char<br>　　S　　　　　　　short<br>　　I　　　　　　　int<br>　　J　　　　　　　long<br>　　F　　　　　　　float<br>　　D　　　　　　　double<br>　　L fully-qualified-class;　　 fully-qualified-class<br>　　<br>　　[ type　　type[]<br>　　<br>　　( arg-types ) ret-type　　method type<br>　　<br>　　一个Java类的方法的Signature可以通过javap命令获取：<br>　　<br>　　javap -s -p Java类名<br>　　<br>　　给调用的函数传参数：<br>　　<br>　　通常我们直接在methodID后面将要传的参数添加在后面，但是还有其他的方法也可以传参数：<br>　　<br>　　CallVoidMethodV可以获取一个数量可变的列表作为参数； <span class=Twe825>www_bitscn_com</span> <br>　　<br>　　CallVoidMethodA可以获取一个union。<br>　　<br>　　调用静态方法：<br>　　<br>　　就是将第二步和第三步调用的方法改为对应的：<br>　　<br>　　GetStaticMethodID获取对应的静态方法的ID<br>　　<br>　　CallStaticIntMethod调用静态方法<br>　　<br>　　调用超类的方法：<br>　　<br>　　用的比较少，自己看啦。^_^。<br>　　<br>　　4)访问Java对象的属性：<br>　　<br>　　访问Java对象的属性和访问Java对象的方法基本上一样，只需要将函数里面的Method改为Field即可<br><br><br><br><br><br>
<img src ="http://www.cppblog.com/wmuu/aggbug/40462.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wmuu/" target="_blank">含笑半步癫</a> 2008-01-05 16:17 <a href="http://www.cppblog.com/wmuu/archive/2008/01/05/40462.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java classpath 批量设置脚本</title><link>http://www.cppblog.com/wmuu/archive/2008/01/04/40401.html</link><dc:creator>含笑半步癫</dc:creator><author>含笑半步癫</author><pubDate>Fri, 04 Jan 2008 07:45:00 GMT</pubDate><guid>http://www.cppblog.com/wmuu/archive/2008/01/04/40401.html</guid><wfw:comment>http://www.cppblog.com/wmuu/comments/40401.html</wfw:comment><comments>http://www.cppblog.com/wmuu/archive/2008/01/04/40401.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wmuu/comments/commentRss/40401.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wmuu/services/trackbacks/40401.html</trackback:ping><description><![CDATA[linux bash:<br><br>
<p><font face=Arial>YOUR_LIB=your_path</font></p>
<p><font face=Arial>for jar in `ls $YOUR_LIB/*.jar`<br>do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CLASSPATH="$CLASSPATH:""$jar"<br>done<br><br><br>windows :<br><br><br></font><font face=Arial>SETLOCAL ENABLEDELAYEDEXPANSION<br>set LIB=xx<br>set CLASSPATH=.<br>FOR %%C IN (LIB\*.jar) DO set CLASSPATH=!CLASSPATH!;%%C<br>echo %CLASSPATH%<br></font><font face=Arial><br><br><br>unix ksh:<br>暂无</font></p>
<img src ="http://www.cppblog.com/wmuu/aggbug/40401.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wmuu/" target="_blank">含笑半步癫</a> 2008-01-04 15:45 <a href="http://www.cppblog.com/wmuu/archive/2008/01/04/40401.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java中Double-Checked Locking 双重锁定的测试代码</title><link>http://www.cppblog.com/wmuu/archive/2007/01/19/17782.html</link><dc:creator>含笑半步癫</dc:creator><author>含笑半步癫</author><pubDate>Fri, 19 Jan 2007 06:59:00 GMT</pubDate><guid>http://www.cppblog.com/wmuu/archive/2007/01/19/17782.html</guid><wfw:comment>http://www.cppblog.com/wmuu/comments/17782.html</wfw:comment><comments>http://www.cppblog.com/wmuu/archive/2007/01/19/17782.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wmuu/comments/commentRss/17782.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wmuu/services/trackbacks/17782.html</trackback:ping><description><![CDATA[
		<p>
				<br /> </p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080"> 1</span> <span style="COLOR: #0000ff">package</span><span style="COLOR: #000000"> test;<br /></span><span style="COLOR: #008080"> 2</span> <span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 3</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> testClone {<br /></span><span style="COLOR: #008080"> 4</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">volatile</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">boolean</span><span style="COLOR: #000000"> isInit;<br /></span><span style="COLOR: #008080"> 5</span> <span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 6</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">volatile</span><span style="COLOR: #000000"> Foo foo;<br /></span><span style="COLOR: #008080"> 7</span> <span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 8</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">volatile</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> time </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080"> 9</span> <span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">10</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Foo {<br /></span><span style="COLOR: #008080">11</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">volatile</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> flg;<br /></span><span style="COLOR: #008080">12</span> <span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">13</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> Foo() {<br /></span><span style="COLOR: #008080">14</span> <span style="COLOR: #000000">            flg </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">15</span> <span style="COLOR: #000000">            </span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"> {<br /></span><span style="COLOR: #008080">16</span> <span style="COLOR: #000000">                Thread.sleep(time);<br /></span><span style="COLOR: #008080">17</span> <span style="COLOR: #000000">            } </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000"> (InterruptedException e) {<br /></span><span style="COLOR: #008080">18</span> <span style="COLOR: #000000">            }<br /></span><span style="COLOR: #008080">19</span> <span style="COLOR: #000000">            </span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">flg;<br /></span><span style="COLOR: #008080">20</span> <span style="COLOR: #000000">            System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Foo inited</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080">21</span> <span style="COLOR: #000000">        }<br /></span><span style="COLOR: #008080">22</span> <span style="COLOR: #000000">    }<br /></span><span style="COLOR: #008080">23</span> <span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">24</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> main(String[] args) </span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000"> InterruptedException {<br /></span><span style="COLOR: #008080">25</span> <span style="COLOR: #000000">        testClone t </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> testClone();<br /></span><span style="COLOR: #008080">26</span> <span style="COLOR: #000000">        t.test();<br /></span><span style="COLOR: #008080">27</span> <span style="COLOR: #000000">    }<br /></span><span style="COLOR: #008080">28</span> <span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">29</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> test() {<br /></span><span style="COLOR: #008080">30</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">; i </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">; </span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">i) {<br /></span><span style="COLOR: #008080">31</span> <span style="COLOR: #000000">            WorkThread t </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> WorkThread();<br /></span><span style="COLOR: #008080">32</span> <span style="COLOR: #000000">            t.start();<br /></span><span style="COLOR: #008080">33</span> <span style="COLOR: #000000">        }<br /></span><span style="COLOR: #008080">34</span> <span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">35</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> (;;) {<br /></span><span style="COLOR: #008080">36</span> <span style="COLOR: #000000">            </span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"> {<br /></span><span style="COLOR: #008080">37</span> <span style="COLOR: #000000">                Thread.sleep(</span><span style="COLOR: #000000">1000</span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080">38</span> <span style="COLOR: #000000">            } </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000"> (InterruptedException e) {<br /></span><span style="COLOR: #008080">39</span> <span style="COLOR: #000000">            }<br /></span><span style="COLOR: #008080">40</span> <span style="COLOR: #000000">            time </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">1000</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">41</span> <span style="COLOR: #000000">            </span><span style="COLOR: #0000ff">synchronized</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">) {<br /></span><span style="COLOR: #008080">42</span> <span style="COLOR: #000000">                foo </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">43</span> <span style="COLOR: #000000">            }<br /></span><span style="COLOR: #008080">44</span> <span style="COLOR: #000000">        }<br /></span><span style="COLOR: #008080">45</span> <span style="COLOR: #000000">    }<br /></span><span style="COLOR: #008080">46</span> <span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">47</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> Foo bar() {<br /></span><span style="COLOR: #008080">48</span> <span style="COLOR: #000000">        Foo f </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> foo;<br /></span><span style="COLOR: #008080">49</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (f </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">) {<br /></span><span style="COLOR: #008080">50</span> <span style="COLOR: #000000">            </span><span style="COLOR: #0000ff">synchronized</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">) {<br /></span><span style="COLOR: #008080">51</span> <span style="COLOR: #000000">                </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (foo </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">) {<br /></span><span style="COLOR: #008080">52</span> <span style="COLOR: #000000">                    foo </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Foo();<br /></span><span style="COLOR: #008080">53</span> <span style="COLOR: #000000">                }<br /></span><span style="COLOR: #008080">54</span> <span style="COLOR: #000000">                </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> foo;<br /></span><span style="COLOR: #008080">55</span> <span style="COLOR: #000000">            }<br /></span><span style="COLOR: #008080">56</span> <span style="COLOR: #000000">        }<br /></span><span style="COLOR: #008080">57</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> f;<br /></span><span style="COLOR: #008080">58</span> <span style="COLOR: #000000">    }<br /></span><span style="COLOR: #008080">59</span> <span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">60</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> WorkThread </span><span style="COLOR: #0000ff">extends</span><span style="COLOR: #000000"> Thread {<br /></span><span style="COLOR: #008080">61</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> run() {<br /></span><span style="COLOR: #008080">62</span> <span style="COLOR: #000000">            </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> (;;) {<br /></span><span style="COLOR: #008080">63</span> <span style="COLOR: #000000">                </span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"> {<br /></span><span style="COLOR: #008080">64</span> <span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">65</span> <span style="COLOR: #000000">                    Foo f </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> bar();<br /></span><span style="COLOR: #008080">66</span> <span style="COLOR: #000000">                    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (f.flg </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">) {<br /></span><span style="COLOR: #008080">67</span> <span style="COLOR: #000000">                        System.out.println(f.flg);<br /></span><span style="COLOR: #008080">68</span> <span style="COLOR: #000000">                    }<br /></span><span style="COLOR: #008080">69</span> <span style="COLOR: #000000">                } </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000"> (Throwable e) {<br /></span><span style="COLOR: #008080">70</span> <span style="COLOR: #000000">                    e.printStackTrace();<br /></span><span style="COLOR: #008080">71</span> <span style="COLOR: #000000">                }<br /></span><span style="COLOR: #008080">72</span> <span style="COLOR: #000000">            }<br /></span><span style="COLOR: #008080">73</span> <span style="COLOR: #000000">        }<br /></span><span style="COLOR: #008080">74</span> <span style="COLOR: #000000">    }<br /></span><span style="COLOR: #008080">75</span> <span style="COLOR: #000000">}<br /></span><span style="COLOR: #008080">76</span> <span style="COLOR: #000000"></span></div>
		<p>
				<br />
				<br />1.4.2jdk编译执行。长时间执行没有发现有网上所说的由于jit优化导致的当分配完Foo的内存，Foo构造函数未初始化完成就将其地址赋值给foo的错误。相信这时候jit已经对代码进行了优化。<br /><br />国外网址关于Double-Checked Locking的文章<a href="http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html">http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html</a></p>
		<h4>A test case showing that it doesn't work</h4>
		<p>Paul Jakubik found an example of a use of double-checked locking that did not work correctly. <a href="http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckTest.java">A slightly cleaned up version of that code is available here</a>. 
</p>
		<p>When run on a system using the Symantec JIT, it doesn't work. In particular, the Symantec JIT compiles 
</p>
		<center>
				<pre>singletons[i].reference = new Singleton();</pre>
		</center>
		<p>to the following (note that the Symantec JIT using a handle-based object allocation system). </p>
		<pre>0206106A   mov         eax,0F97E78h
0206106F   call        01F6B210                  ; allocate space for
                                                 ; Singleton, return result in eax
02061074   mov         dword ptr [ebp],eax       ; EBP is &amp;singletons[i].reference 
                                                ; store the unconstructed object here.
02061077   mov         ecx,dword ptr [eax]       ; dereference the handle to
                                                 ; get the raw pointer
02061079   mov         dword ptr [ecx],100h      ; Next 4 lines are
0206107F   mov         dword ptr [ecx+4],200h    ; Singleton's inlined constructor
02061086   mov         dword ptr [ecx+8],400h
0206108D   mov         dword ptr [ecx+0Ch],0F84030h
</pre>
		<p>As you can see, the assignment to <tt>singletons[i].reference</tt> is performed before the constructor for Singleton is called. This is completely legal under the existing Java memory model, and also legal in C and C++ (since neither of them have a memory model). <br />上面是国外网站给出的jit代码和说明。<br /><br /><br /></p>
<img src ="http://www.cppblog.com/wmuu/aggbug/17782.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wmuu/" target="_blank">含笑半步癫</a> 2007-01-19 14:59 <a href="http://www.cppblog.com/wmuu/archive/2007/01/19/17782.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>试用java1.5，乱谈</title><link>http://www.cppblog.com/wmuu/archive/2006/07/19/10208.html</link><dc:creator>含笑半步癫</dc:creator><author>含笑半步癫</author><pubDate>Wed, 19 Jul 2006 02:19:00 GMT</pubDate><guid>http://www.cppblog.com/wmuu/archive/2006/07/19/10208.html</guid><wfw:comment>http://www.cppblog.com/wmuu/comments/10208.html</wfw:comment><comments>http://www.cppblog.com/wmuu/archive/2006/07/19/10208.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/wmuu/comments/commentRss/10208.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wmuu/services/trackbacks/10208.html</trackback:ping><description><![CDATA[java1.5出来很久了，最近才去试了试。发现1.5虽然说支持模板了，但是像int 这样的基础类型还是不能支持，只能支持类对象。而且不支持运算符重载，极大限制了模板的使用。比起c++的模板，意义不是很大，最大的好处是从容器里头取对象不用手工进行类型转换。看来先天不足，后天还是不好补。无论sun如何努力，始终无法掩盖设计上的失败。<br />1.5在线程方面多了线程池，和一些其他功能，还是不错的。因为我刚好用的到：）。这让我想到c++，比起sun及其第三方的java库的疯狂扩张，c++的标准库让人感觉过于保守。java对一些实际上已经成为标准的东西的支持，以及c++对这些东西自生自灭的态度(虽然有boost库，但毕竟不是正式标准)以及对标准库的实现放任自由的态度(没有一个标准的实现)，难免让c++的支持者感到一些失望。<img src ="http://www.cppblog.com/wmuu/aggbug/10208.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wmuu/" target="_blank">含笑半步癫</a> 2006-07-19 10:19 <a href="http://www.cppblog.com/wmuu/archive/2006/07/19/10208.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>看文章《Java 编程的动态性》后的想法</title><link>http://www.cppblog.com/wmuu/archive/2006/05/31/7992.html</link><dc:creator>含笑半步癫</dc:creator><author>含笑半步癫</author><pubDate>Wed, 31 May 2006 14:13:00 GMT</pubDate><guid>http://www.cppblog.com/wmuu/archive/2006/05/31/7992.html</guid><wfw:comment>http://www.cppblog.com/wmuu/comments/7992.html</wfw:comment><comments>http://www.cppblog.com/wmuu/archive/2006/05/31/7992.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wmuu/comments/commentRss/7992.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wmuu/services/trackbacks/7992.html</trackback:ping><description><![CDATA[java里头反射很强，但是要把一个函数传递出去确很麻烦。sun把原先的枚举类变成了迭代器类，1.5里头不甘愿的把泛形加了进来。以后呢？我想函数也会像c一样可以传递，说不定说有的东西都是对象，函数也是一种对象，可以自由传递。<br />接着加了泛形的util包会不会越来越像stl呢？<br /><img src ="http://www.cppblog.com/wmuu/aggbug/7992.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wmuu/" target="_blank">含笑半步癫</a> 2006-05-31 22:13 <a href="http://www.cppblog.com/wmuu/archive/2006/05/31/7992.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学用BCEL设计字节码的记录(java)</title><link>http://www.cppblog.com/wmuu/archive/2006/05/31/7947.html</link><dc:creator>含笑半步癫</dc:creator><author>含笑半步癫</author><pubDate>Wed, 31 May 2006 08:44:00 GMT</pubDate><guid>http://www.cppblog.com/wmuu/archive/2006/05/31/7947.html</guid><wfw:comment>http://www.cppblog.com/wmuu/comments/7947.html</wfw:comment><comments>http://www.cppblog.com/wmuu/archive/2006/05/31/7947.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/wmuu/comments/commentRss/7947.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wmuu/services/trackbacks/7947.html</trackback:ping><description><![CDATA[
		<p>最近看了<span style="COLOR: #999999">Java 编程的动态性，第 7 部分: </span>用 BCEL 设计字节码，网址是<a href="http://www-128.ibm.com/developerworks/cn/java/j-dyn0414/">http://www-128.ibm.com/developerworks/cn/java/j-dyn0414/</a><br /><br />其中的示范代码解释的不是很详细，这方面的中文资料又少，只好自己花时间看下去。bcel的类库却是不够友好，api文档也是走马观花的点一下，很多函数没有说明。理解基本靠猜，还好有个示范代码。下面对自己理解的东西做个记录，详细的代码可以到上面的链接下载。<br /><br /><br />import java.io.FileOutputStream;<br />import java.io.IOException;</p>
		<p>import org.apache.bcel.Constants;<br />import org.apache.bcel.classfile.ClassParser;<br />import org.apache.bcel.classfile.JavaClass;<br />import org.apache.bcel.classfile.Method;<br />import org.apache.bcel.generic.ClassGen;<br />import org.apache.bcel.generic.ConstantPoolGen;<br />import org.apache.bcel.generic.InstructionConstants;<br />import org.apache.bcel.generic.InstructionFactory;<br />import org.apache.bcel.generic.InstructionList;<br />import org.apache.bcel.generic.MethodGen;<br />import org.apache.bcel.generic.ObjectType;<br />import org.apache.bcel.generic.PUSH;<br />import org.apache.bcel.generic.Type;</p>
		<p>public class BCELTiming {<br />    /**<br />     * Add timing wrapper to method of class. The method can accept any<br />     * arguments and return any type (including void), but must be a normal<br />     * (non-static, non-initializer) method to be used with this code as<br />     * currently implemented. Handling the other types of methods would not<br />     * involve any fundamental changes to the code.<br />     * <br />     * @param cgen<br />     *            generator for class being modified<br />     * @param method<br />     *            current method to be enhanced with timing wrapper<br />     */</p>
		<p>    private static void addWrapper(ClassGen cgen, Method method) {</p>
		<p>        // set up the construction tools<br />        InstructionFactory ifact = new InstructionFactory(cgen);<br />        InstructionList ilist = new InstructionList();<br />        ConstantPoolGen pgen = cgen.getConstantPool();<br />        String cname = cgen.getClassName();<br />        MethodGen wrapgen = new MethodGen(method, cname, pgen);<br />        wrapgen.setInstructionList(ilist);</p>
		<p>        // rename a copy of the original method<br />        MethodGen methgen = new MethodGen(method, cname, pgen);<br />        cgen.removeMethod(method);<br />        String iname = methgen.getName() + "$impl";<br />        methgen.setName(iname);<br />        cgen.addMethod(methgen.getMethod());<br />        //以上是一下初始化的工作<br />        </p>
		<p>        // compute the size of the calling parameters<br />        // operand stack操作数堆栈<br />        Type[] types = methgen.getArgumentTypes(); // 取出参数类型数组</p>
		<p>        // solt代表本地变量的堆栈偏移量,里头储存了调用methen代表的函数的参数<br />        int slot = methgen.isStatic() ? 0 : 1; // 这种方式与Java如何处理方法调用有关。对于非静态的方法，每次调用的第一个（隐藏的）参数是目标对象的this引用（就是位置0储存的内容）。<br />        for (int i = 0; i &lt; types.length; i++) {<br />            slot += types[i].getSize();// 累计个个参数类型的长度，<br />        }<br />        // 现在solt指向最后一个参数的下一个位置</p>
		<p>        // save time prior to invocation<br />        // 调用静态的long java.lang.System.currentTimeMillis()方法,调用结束后函数的返回的long类型的值会压入operand stack操作数堆栈<br />        ilist.append(ifact.createInvoke("java.lang.System",<br />                "currentTimeMillis", Type.LONG, Type.NO_ARGS,<br />                Constants.INVOKESTATIC));<br />        ilist.append(InstructionFactory.createStore(Type.LONG, slot));// 将operand stack的top保存到本地变量堆栈的slot位置,operand stack弹出long值</p>
		<p>        // call the wrapped method<br />        int offset = 0; // 偏移量<br />        short invoke = Constants.INVOKESTATIC; // 预先设置为调用静态函数<br />        if (!methgen.isStatic()) { // 如果不是调用静态函数,将调用的第一个（隐藏的）参数(目标对象的this引用)压入operand stack<br />            ilist.append(InstructionFactory.createLoad(Type.OBJECT, 0));<br />            offset = 1;// 偏移量加1<br />            invoke = Constants.INVOKEVIRTUAL;// 设置为调用非静态函数<br />        }<br />        for (int i = 0; i &lt; types.length; i++) { // 遍历所有参数<br />            Type type = types[i];<br />            ilist.append(InstructionFactory.createLoad(type, offset)); // 按参数类型把参数一个个从本地变量堆栈取出，压入operand stack<br />            offset += type.getSize();<br />        }<br />        Type result = methgen.getReturnType();// 取得要调用函数的返回值类型<br />        ilist.append(ifact.createInvoke(cname, iname, result, types, invoke));// 调用方法名为iname的函数</p>
		<p>        // store result for return later<br />        if (result != Type.VOID) {<br />            ilist.append(InstructionFactory.createStore(result, slot + 2)); // 将名为iname的函数返回值复制到本地变量堆栈的slot+2的位置上<br />        }</p>
		<p>        // print time required for method call<br />        // 获取静态对象java.lang.System.out的引用,返回值压入operand stack<br />        ilist.append(ifact.createFieldAccess("java.lang.System", "out",<br />                new ObjectType("java.io.PrintStream"), Constants.GETSTATIC));<br />        ilist.append(InstructionConstants.DUP);// 取operand stack的top,压入operand stack。完成后load_stack的头两个元素是静态对象java.lang.System.out的引用<br />        ilist.append(InstructionConstants.DUP);// 取operand stack的top,压入operand stack。现在有3个java.lang.System.out的引用。供下面3次调用out.print()函数使用<br />        String text = "Call to method " + methgen.getName() + " took ";<br />        ilist.append(new PUSH(pgen, text));// 将text放入pgen（代表常量池）,并把其在pgen的引用压入operand stack(供out.print(Sting)调用的参数)<br />        ilist.append(ifact.createInvoke("java.io.PrintStream", "print",<br />                        Type.VOID, new Type[] { Type.STRING },<br />                        Constants.INVOKEVIRTUAL));// 调用结束，operand stack弹出一个String的引用和一个out的引用(还剩2个out),函数没有返回值</p>
		<p>        ilist.append(ifact.createInvoke("java.lang.System",<br />                "currentTimeMillis", Type.LONG, Type.NO_ARGS,<br />                Constants.INVOKESTATIC));// 调用java.lang.System.currentTimeMillis()方法,调用结束后函数的返回的long类型的值会压入堆栈operand stack<br />        ilist.append(InstructionFactory.createLoad(Type.LONG, slot));// 从本地变量堆栈的slot位置载入先前储存的long值，压入operand stack<br />        ilist.append(InstructionConstants.LSUB);// 调用long的减法指令,弹出2个long值，并把结果压入operand stack,现在operand stack的top第一个是long，第二个是out的引用<br />        ilist.append(ifact.createInvoke("java.io.PrintStream", "print",<br />                Type.VOID, new Type[] { Type.LONG }, Constants.INVOKEVIRTUAL));// 调用out.print(long)方法<br />        ilist.append(new PUSH(pgen, " ms."));// 将String对象" ms."放入pgen,并把其在pgen的引用压入operand stack(供out.print(Sting)调用的参数)<br />        ilist<br />                .append(ifact.createInvoke("java.io.PrintStream", "println",<br />                        Type.VOID, new Type[] { Type.STRING },<br />                        Constants.INVOKEVIRTUAL));</p>
		<p>        // return result from wrapped method call<br />        if (result != Type.VOID) {<br />            ilist.append(InstructionFactory.createLoad(result, slot + 2));// 处理返回值,如果不为空，从本地对象堆栈的slot+2位置读取指定类型的返回值压入operand stack<br />        }<br />        ilist.append(InstructionFactory.createReturn(result)); //调用处理返回值的指令，result为返回值的类型</p>
		<p>        //下面是一下扫尾工作<br />        // finalize the constructed method<br />        wrapgen.stripAttributes(true);<br />        wrapgen.setMaxStack();<br />        wrapgen.setMaxLocals();<br />        cgen.addMethod(wrapgen.getMethod());<br />        ilist.dispose();<br />    }</p>
		<p>    public static void main(String[] argv) {<br />        if (argv.length == 2 &amp;&amp; argv[0].endsWith(".class")) {<br />            try {</p>
		<p>                JavaClass jclas = new ClassParser(argv[0]).parse();<br />                ClassGen cgen = new ClassGen(jclas);<br />                Method[] methods = jclas.getMethods();<br />                int index;<br />                for (index = 0; index &lt; methods.length; index++) {<br />                    if (methods[index].getName().equals(argv[1])) {<br />                        break;<br />                    }<br />                }<br />                if (index &lt; methods.length) {<br />                    addWrapper(cgen, methods[index]);<br />                    FileOutputStream fos = new FileOutputStream(argv[0]);<br />                    cgen.getJavaClass().dump(fos);<br />                    fos.close();<br />                } else {<br />                    System.err.println("Method " + argv[1] + " not found in "<br />                            + argv[0]);<br />                }<br />            } catch (IOException ex) {<br />                ex.printStackTrace(System.err);<br />            }</p>
		<p>        } else {<br />            System.out.println("Usage: BCELTiming class-file method-name");<br />        }<br />    }<br />}<br /><br /><br />相对javassist，bcel确实比较复杂。但是bcel给我的感觉比较自由，有种一切尽在掌握的感觉，这一点比较我喜欢。<br />虽然自由，但是用bcel写一个类的实现绝对不会是一件让人开心的事情，如果碰巧你的实现又稍微复杂了点(比如实现了xx接口，又增加了一些函数和成员变量)。而且你的实现未必会比javac编译出来的代码效率高（不考虑jvm的动态优化）。<br />不过，先把你要实现的类的代码写出来，按照代码来写bcel的实现，会降低些实现难度。</p>
<img src ="http://www.cppblog.com/wmuu/aggbug/7947.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wmuu/" target="_blank">含笑半步癫</a> 2006-05-31 16:44 <a href="http://www.cppblog.com/wmuu/archive/2006/05/31/7947.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一下关于java动态代码生成的文章</title><link>http://www.cppblog.com/wmuu/archive/2006/05/28/7753.html</link><dc:creator>含笑半步癫</dc:creator><author>含笑半步癫</author><pubDate>Sat, 27 May 2006 19:05:00 GMT</pubDate><guid>http://www.cppblog.com/wmuu/archive/2006/05/28/7753.html</guid><wfw:comment>http://www.cppblog.com/wmuu/comments/7753.html</wfw:comment><comments>http://www.cppblog.com/wmuu/archive/2006/05/28/7753.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wmuu/comments/commentRss/7753.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wmuu/services/trackbacks/7753.html</trackback:ping><description><![CDATA[
		<a href="http://www-128.ibm.com/developerworks/cn/java/j-cwt05125/">
				<font color="#000000">http://www-128.ibm.com/developerworks/cn/java/j-cwt05125/</font>
		</a>
		<font color="#000000">  <span style="COLOR: #999999">Classworking 工具箱: </span>ASM classworking<br /><br /><a href="http://www-128.ibm.com/developerworks/cn/java/j-dyn0414/">http://www-128.ibm.com/developerworks/cn/java/j-dyn0414/</a>  <span style="COLOR: #999999">Java 编程的动态性。这个系列中作者比较详细的介绍了javassist，粗略的提到了bcel和asm。<br /><br />作者是<a href="http://www-128.ibm.com/developerworks/cn/java/j-dyn0610/#author"><font color="#996699">Dennis Sosnoski</font></a><font color="#000000">,看了他<span style="COLOR: #999999">Java 编程的动态性的前六篇，感觉不错。因为国内这方面的资料太少了。</span></font><br />还有就是ibm上的文档确实不错。虽然有的时间比较旧，但是确实对于国内来说不可多得的中文文档。当然新的文档也不少。</span></font>
<img src ="http://www.cppblog.com/wmuu/aggbug/7753.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wmuu/" target="_blank">含笑半步癫</a> 2006-05-28 03:05 <a href="http://www.cppblog.com/wmuu/archive/2006/05/28/7753.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java里头居然还有SoftReference、WeakReference 和 PhantomReference</title><link>http://www.cppblog.com/wmuu/archive/2006/05/11/6918.html</link><dc:creator>含笑半步癫</dc:creator><author>含笑半步癫</author><pubDate>Thu, 11 May 2006 02:09:00 GMT</pubDate><guid>http://www.cppblog.com/wmuu/archive/2006/05/11/6918.html</guid><wfw:comment>http://www.cppblog.com/wmuu/comments/6918.html</wfw:comment><comments>http://www.cppblog.com/wmuu/archive/2006/05/11/6918.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/wmuu/comments/commentRss/6918.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wmuu/services/trackbacks/6918.html</trackback:ping><description><![CDATA[最近看文档的时候偶然看到java里头居然还有SoftReference、WeakReference 和 PhantomReference这些东西。仔细看了看，发现sun现在越来越有个性，居然加了这些鸡肋。感觉sun这厮就是把程序员当tester，经常弄些垃圾忽悠大家。<img src ="http://www.cppblog.com/wmuu/aggbug/6918.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wmuu/" target="_blank">含笑半步癫</a> 2006-05-11 10:09 <a href="http://www.cppblog.com/wmuu/archive/2006/05/11/6918.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>