Java中JNI的使用詳解第一篇:HelloWorld


轉自:   http://blog.csdn.net/jiangwei0910410003/article/details/17465085

今天開始研究JNI技術,首先還是老套路,輸出一個HelloWorld:具體流程如下:在Java中定義一個方法,在C++中實現這個方法,在方法內部輸出“Hello World",然后再回到Java中進行調用。分為以下步驟:

第一步:在Eclipse中建立一個類:JNIDemo

 

[java] view plain copy
  1. package com.jni.demo;  
  2. public class JNIDemo {  
  3.     //定義一個本地方法  
  4.     public native void sayHello();  
  5.     public static void main(String[] args){  
  6.         //調用動態鏈接庫  
  7.         System.loadLibrary("JNIDemo");  
  8.         JNIDemo jniDemo = new JNIDemo();  
  9.         jniDemo.sayHello();  
  10.     }  
  11. }  
其中sayHello就是要在C++中實現的方法。

 

第二步:使用javah命令將JNIDemo生成.h的頭文件:

命令如下:

E:\workspace\JNIDemo\bin>javah com.jni.demo.JNIDemo

注意:

1. 首先要確保配置了Java的環境變量的配置,不然javah命令不能用,具體怎么配置見:http://blog.csdn.net/jiangwei0910410003/article/details/17463173

2. 我的Java項目是放在E:\workspace中的,所以首先進入到工程的bin目錄中,然后使用javah命令生成頭文件

3. javah后面的類文件的格式:是類的全名(包名+class文件名),同時不能有.class后綴

命令執行成功后會在bin目錄中生成頭文件:com_jni_demo_JNIDemo.h


但是我們還需要注意一個問題,就是如果我們的包含native方法的類,如果引用其他地方的類,那么這時候進入bin\classes\目錄下會出現問題提示找不到指定的類,這時候我們需要切換到源碼目錄src下運行即可。

 

第三步:使用VC6.0生成.dll文件:

首先創建一個dll工程:




在.cpp文件中輸入如下代碼:

  1. <span style="font-size:14px;">#include<iostream.h>  
  2. #include "com_jni_demo_JNIDemo.h"  
  3.   
  4. JNIEXPORT void JNICALL Java_com_jni_demo_JNIDemo_sayHello (JNIEnv * env, jobject obj)  
  5. {  
  6. cout<<"Hello World"<<endl;  
  7. }</span>  

說明:

1. JNIEXPORT void JNICALL Java_com_jni_demo_JNIDemo_sayHello (JNIEnv * env, jobject obj)
{
cout<<"Hello World"<<endl;
}

這個方法的聲明可以在上面生成的com_jni_demo_JNIDemo.h頭文件中找到,這個就是Java工程中的sayHello方法的實現

2. 這里編譯會出現幾個問題:

(1):會提示你找不到相應的頭文件:


這時候需要將jni.h,jni_md.h文件考到工程目錄中,這兩個文件的具體位置在:


java的安裝目錄中的include文件夾下,jni_md.h這個文件在win32文件夾中,找到這兩個文件后,將其拷貝到C++的工程目錄中;

(2) 當拷貝到這兩個文件之后,編譯還是提示找不到這兩個文件:主要原因就是#include<jni.h>這個是從系統目錄中查找jni.h頭文件的,而我們只把jni.h拷貝到工程目錄中,所以需要在com_jni_demo_JNIDemo.h頭文件中將#include<jni.h>改成#include "jni.h",同理在jni.h文件中將#include<jni_md.h>改成#include "jni_md.h"

(3) 同時還有一個錯誤就是,提示:e:\c++\jnidemo\jnidemo.cpp(9) : fatal error C1010: unexpected end of file while looking for precompiled header directive,這個是預編譯頭文件讀寫錯誤,這時候還要在VC中進行設置:項目-》設置-》C/C++;在分類中選擇預編譯頭文件,選擇不使用預補償頁眉:


這樣,編譯成功,生成JNIDemo.dll文件在C++工程中的Debug目錄中

 

第四步:將JNIDemo.dll文件添加到path環境變量中:


注意:在用戶變量中的path設置,用分號隔開: ” ;E:\C++\Debug“,這樣就將.dll文件添加到環境變量中了

 

第五步:在Eclipse中調用sayHello方法輸出"Hello World":代碼如下:

[java] view plain copy
  1. public static void main(String[] args){  
  2.     //調用動態鏈接庫  
  3.     System.loadLibrary("JNIDemo");  
  4.     JNIDemo jniDemo = new JNIDemo();  
  5.     jniDemo.sayHello();  
  6. }  

System.loadLibrary方法就是加載JNIDemo.dll文件的,一定要注意不要有.dll后綴名,只需要文件名即可;

注意:運行的時候會報錯:


這個提示就是沒有找到JNIDemo.dll文件,這時候我們需要關閉Eclipse,然后在打開,運行就沒有錯了,原因是Eclipse每次打開的時候都會去讀取環境變量的配置,我們剛才配置的path,沒有立即生效,所以要關閉Eclipse,然后從新打開一次即可。

至此,一個簡單的JNI例子到此演示完畢,后續還有更高級的應用,要及時關注呀!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM