执行完上述命令以后生成<strong>D:\JNI\HelloWorld.class</strong>文件</div>
<h3><a name="t8"></a>3.3.使用javah -jni java类名生成扩展名为h的头文件</h3> <div> <div class="dp-highlighter bg\_java"> <div class="bar"> <div class="tools"><strong>\[java\]</strong> <a class="ViewSource" title="view plain" href="http://blog.csdn.net/xw13106209/article/details/6989415#">view plain</a><span data-mod="popu\_168"><span data-mod="popu\_168"> <a class="CopyToClipboard" title="copy" href="http://blog.csdn.net/xw13106209/article/details/6989415#">copy</a></span></span> <div> </div> </div> </div> <ol class="dp-j" start="1"> <li class="alt">d:\\JNI>javah -jni HelloWorld </li> </ol></div>执行完上述命令以后生成<strong>D:\JNI\HelloWorld.h</strong>文件,该文件内容如下:</div>
<div> <div class="dp-highlighter bg\_java"> <div class="bar"> <div class="tools"><strong>\[java\]</strong> <a class="ViewSource" title="view plain" href="http://blog.csdn.net/xw13106209/article/details/6989415#">view plain</a><span data-mod="popu\_168"><span data-mod="popu\_168"> <a class="CopyToClipboard" title="copy" href="http://blog.csdn.net/xw13106209/article/details/6989415#">copy</a></span></span> <div> </div> </div> </div> <ol class="dp-j" start="1"> <li class="alt"><span class="comment">/\* DO NOT EDIT THIS FILE - it is machine generated \*/ </span></li> <li>#include <jni.h> </li> <li class="alt"><span class="comment">/\* Header for class HelloWorld \*/ </span></li> <li> </li> <li class="alt">#ifndef \_Included\_HelloWorld </li> <li>#define \_Included\_HelloWorld </li> <li class="alt">#ifdef \_\_cplusplus </li> <li>extern <span class="string">"C" { </span></li> <li class="alt">#endif </li> <li><span class="comment">/\* </span></li> <li class="alt"><span class="comment"> \* Class: HelloWorld </span></li> <li><span class="comment"> \* Method: displayHelloWorld </span></li> <li class="alt"><span class="comment"> \* Signature: ()V </span></li> <li><span class="comment"> \*/ </span></li> <li class="alt">JNIEXPORT <span class="keyword">void JNICALL Java\_HelloWorld\_displayHelloWorld </span></li> <li> (JNIEnv \*, jobject); </li> <li class="alt"> </li> <li>#ifdef \_\_cplusplus </li> <li class="alt">} </li> <li>#endif </li> <li class="alt">#endif </li> </ol></div>这里我们可以这样理解:这个h文件相当于我们在java里面的接口,这里声明了一个 Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject);方法,然后在我们的本地方法里面实现这个方法,也就是说我们在编写C/C++程序的时候所使用的方法名必须和这里的一致</div>
<h3><a name="t9"></a>3.4.使用C/C++实现本地方法</h3> <div>创建HelloWorldImpl.cpp,代码如下所示: <div class="dp-highlighter bg\_java"> <div class="bar"> <div class="tools"><strong>\[java\]</strong> <a class="ViewSource" title="view plain" href="http://blog.csdn.net/xw13106209/article/details/6989415#">view plain</a><span data-mod="popu\_168"><span data-mod="popu\_168"> <a class="CopyToClipboard" title="copy" href="http://blog.csdn.net/xw13106209/article/details/6989415#">copy</a></span></span> <div> </div> </div> </div> <ol class="dp-j" start="1"> <li class="alt">#include <span class="string">"HelloWorld.h" </span></li> <li>#include <stdio.h> </li> <li class="alt">#include <jni.h> </li> <li><span class="comment">/\* </span></li> <li class="alt"><span class="comment"> \* Class: HelloWorld </span></li> <li><span class="comment"> \* Method: displayHelloWorld </span></li> <li class="alt"><span class="comment"> \* Signature: ()V </span></li> <li><span class="comment"> \*/ </span></li> <li class="alt">JNIEXPORT <span class="keyword">void JNICALL Java\_HelloWorld\_displayHelloWorld </span></li> <li> (JNIEnv \*, jobject) </li> <li class="alt"> { </li> <li> printf(<span class="string">"Hello World!\\n"); </span></li> <li class="alt"> <span class="keyword">return; </span></li> <li>} </li> </ol></div> <h3><a name="t10"></a>3.5.将C/C++编写的文件生成动态连接库</h3> </div> <div>将<strong>D:\\Program Files\\Java\\jdk1.6.0\_26\\include\\jni.h</strong>和<strong>D:\\Program Files\\Java\\jdk1.6.0\_26\\include\\win32\\jni\_md.h</strong>这两个文件拷贝到<strong>D:\\JNI\\</strong>目录下。与HelloWorldImpl.cpp同目录,目录结构如下图所示:</div> <div><img src="http://hi.csdn.net/attachment/201111/19/0\_13217054802DFm.gif" alt=""></div> <h3><a name="t11"></a>3.7 执行 cl/LD D:\\JNI\\HelloWorldImpl.cpp 得到HelloWorldImpl.dll文件</h3> <div>我使用的是visual studio 2010,要使用其中的cl命令,必须打开visual studio 命令行,如下图所示:</div> <div><img src="http://hi.csdn.net/attachment/201111/19/0\_1321705839zhK8.gif" alt=""></div> <div>然后再命令行中输入如下命令</div> <div> <div class="dp-highlighter bg\_java"> <div class="bar"> <div class="tools"><strong>\[java\]</strong> <a class="ViewSource" title="view plain" href="http://blog.csdn.net/xw13106209/article/details/6989415#">view plain</a><span data-mod="popu\_168"><span data-mod="popu\_168"> <a class="CopyToClipboard" title="copy" href="http://blog.csdn.net/xw13106209/article/details/6989415#">copy</a></span></span> <div> </div> </div> </div> <ol class="dp-j" start="1"> <li class="alt">cl/LD D:\\JNI\\HelloWorldImpl.cpp </li> </ol></div>具体如下图所示:</div>
<div><img src="http://hi.csdn.net/attachment/201111/19/0\_1321705922dliG.gif" alt=""><br>执行完上述命令以后,我们在C:\\Program Files (x86)\\Microsoft Visual Studio 10.0\\VC可以看到生成的四个文件,分别是:</div> <div> <ul> <li>HelloWorldImpl.dll</li> <li>HelloWorldImpl.exp</li> <li>HelloWorldImpl.lib</li> <li>HelloWorldImpl.obj</li> </ul> <div>将其中的HelloWorldImpl.dll拷贝到<strong>D:\\JNI\\</strong>目录下。</div> </div> <h3><a name="t12"></a>3.8.执行class得到结果</h3> <div>在cmd中运行:</div> <div> <div class="dp-highlighter bg\_java"> <div class="bar"> <div class="tools"><strong>\[java\]</strong> <a class="ViewSource" title="view plain" href="http://blog.csdn.net/xw13106209/article/details/6989415#">view plain</a><span data-mod="popu\_168"><span data-mod="popu\_168"> <a class="CopyToClipboard" title="copy" href="http://blog.csdn.net/xw13106209/article/details/6989415#">copy</a></span></span> <div> </div> </div> </div> <ol class="dp-j" start="1"> <li class="alt">d:\\JNI>java HelloWorld </li> </ol></div>具体如下图所示:</div>
<div><img src="http://hi.csdn.net/attachment/201111/19/0\_13217061542EyJ.gif" alt=""></div> <div> </div> <h2><a name="t13"></a>4.在eclipse下运行</h2> <div> <ul> <li>4.1在eclipse下创建一个叫做jnitest的project</li> <li>4.2添加一个同3.1一样的HelloWorld.java</li> <li>4.3保存HelloWorld.java以后在jnitest\\bin目录下会生成HelloWorld.class。</li> <li>4.4根据根据HelloWorld.class生成HelloWorld.h文件</li> <li>4.5创建HelloWorldImpl.cpp来实现HelloWorld.h中的方法</li> <li>4.6使用Visual studio 2010生成HelloWorldImpl.dll</li> <li>4.7在Eclipse中运行HelloWorld程序,报错如下:</li> </ul> </div> <div> <div class="dp-highlighter bg\_java"> <div class="bar"> <div class="tools"><strong>\[java\]</strong> <a class="ViewSource" title="view plain" href="http://blog.csdn.net/xw13106209/article/details/6989415#">view plain</a><span data-mod="popu\_168"><span data-mod="popu\_168"> <a class="CopyToClipboard" title="copy" href="http://blog.csdn.net/xw13106209/article/details/6989415#">copy</a></span></span> <div> </div> </div> </div> <ol class="dp-j" start="1"> <li class="alt">java.lang.UnsatisfiedLinkError: no HelloWorldImpl in java.library.path </li> <li> at java.lang.ClassLoader.loadLibrary(ClassLoader.java:<span class="number">1738) </span></li> <li class="alt"> at java.lang.Runtime.loadLibrary0(Runtime.java:<span class="number">823) </span></li> <li> at java.lang.System.loadLibrary(System.java:<span class="number">1028) </span></li> <li class="alt"> at HelloWorld.<clinit>(HelloWorld.java:<span class="number">6) </span></li> </ol></div> </div> <div> <ul> <li>4.8将HelloWorldImpl.dll拷贝到C:\\Windows\\System32</li> <li>4.9再次执行HelloWorld程序,程序正常运行,console输出“Hello World!”</li> </ul> </div></div>