JAVA認證基礎知識:JavaNativeInterface學習小結
JNI是Java Native Interface的縮寫,中文為JAVA本地調用。使用JNI可以很方便的用我們的Java程序調用C/C++程序。很多時候,某些功能用Java無法實現,比如説涉及到底層驅動的一些功能,這時候我們就可以利用JNI來調用C或者C++程序來實現,這就是JNI的強大之處。但是JNI也有它的缺點,使用java與本地已編譯的代碼交互,通常會喪失平台可移植性。
下面是一個JNI例子,調用C++輸出"hello world":
第一步:創建Java類,在裏面定義一個本地方法(用native關鍵字修飾的方法)
public native void sayHello();
第二步:使用javah命令(javah 類的全路徑)生成本地方法的C++頭文件
在DOS窗口中進入工程所在目錄,然後執行javah Native命令,執行完之後就會在當前目錄生成一個後綴名為。h的頭文件,如com_test_TestNative.h,這個頭文件是根據包名和類名來命名的。
1 /* DO NOT EDIT THIS FILE - it is machine generated */
2 #include
3 /* Header for class com_test_TestNative */
4
5 #ifndef _Included_com_test_TestNative
6 #define _Included_com_test_TestNative
7 #ifdef __cplusplus
8 extern "C" {
9 #endif
10 /*
11 * Class: com_test_TestNative
12 * Method: sayHello
13 * Signature: ()V
14 */
15 JNIEXPORT void JNICALL Java_com_test_TestNative_sayHello
16 (JNIEnv *, jobject);
17
18 #ifdef __cplusplus
19 }
20 #endif
21 #endif
15、16行是對TestNative類中的本地方法sayHello()的聲明。這個h文件相當於我們在java裏面的接口,這裏聲明瞭一個 Java_com_test_TestNative_sayHello (JNIEnv *, jobject);方法,然後在我們的本地方法裏面實現這個方法,也就是説我們在編寫C/C++程序的時候所使用的方法名必須和這裏的一致。
第三步:編寫C/C++本地代碼,生成動態鏈接庫文件
首先在VC6.0(當然也可以用其他工具)中創建一個dll工程---Win32 Dynamic-Link Library工程。然後將上面生成的頭文件com_test_TestNative.h添加到該工程中,然後創建一個源文件引用該頭文件並且實現頭文件中本地函數的功能:
1 #include
2 #include"com_test_TestNative.h"
3
4 JNIEXPORT void JNICALL Java_com_test_TestNative_sayHello(JNIEnv *env, jobject obj)
5 {
6 cout《"hello world!"《endl;
7 }
這裏因為com_test_TestNative.h中引入了jni.h所以要將jni.h加入到VC6.0安裝目錄下的`Include目錄中。jni.h在JDK安裝目錄下的include中,同時得件include/win32中的兩個頭文件jawt_md.h、jni_md.h也導入到 VC6.0中。
將所依賴的頭文件導入之後,我們就可以構建該工程了,按F7就行了,完了會在工程目錄中的Degug目錄下生成一個動態鏈接庫文件,我這裏生成的是.我們就可以將該dll文件拷貝到環境變量path所包含的目錄下給咱們的Java程序調用了,為了方便,我們也可以將 dll所在的工程目錄加入到環境變量path中去,這樣可以避免每次都要拷貝的麻煩。注意修改環境變量之後要重啟myeclipse.
第四步:Java調用本地函數
1 package ;
2
3 public class TestNative {
4 public native void sayHello();
5
6 /**
7 * @param args
8 */
9 public static void main(String[] args) {
10 Library("NativeCode");
11 TestNative tNative = new TestNative();
12 ello();
13 }
14 }
第10行是加載動態鏈接庫,JVM只需要加載一次就可以調用了,"NativeCode"是上面生成的動態鏈接庫的名字,不含後綴名。
運行該程序,成功打印輸出了"hello world".
-
Java考試格林模擬題
question14)whichofthefollowinglinesofcodewillcompilewithouterror1)inti=0;if(i){tln("hello");}2)booleanb=true;booleanb2=true;if(b==b2){tln("sotrue");}3)inti=1;intj=2;if(i==1||j==2)tln("ok");4)inti=1;intj=2;if(i==1&|j==2)tln("ok");questio...
-
2016最新java classloader詳解
Classloader類加載器,用來加載Java類到Java虛擬機中的一種加載器。那麼Classloader類有什麼原理呢?下面跟yjbys小編一起來學習一下!JAVA啟動後,是經過JVM各級ClassLoader來加載各個類到內存。為了更加了解加載過程,我通過分析和寫了一個簡單的ClassLoader來粗淺的...
-
XML入門知識彙總
XML是可擴展標記語言,標準通用標記語言的子集,是一種用於標記電子文件使其具有結構性的標記語言。下面小編準備了關於XML的入門知識,歡迎大家參考!是用來組織數據結構的結構數據包括如:電子數據表、地址簿、控制器參數、財務交易及技術繪圖等。XML是一系列文字格式...
-
JAVA正則表達式語法大全
正則表達式使用單個字符串來描述、匹配一系列符合某個句法規則的字符串。你知道Java正則表達式語法有哪些嗎?跟yjbys小編一起來看看吧![正則表達式]文本框輸入內容控制整數或者小數:^[0-9]+\.{0,1}[0-9]{0,2}$只能輸入數字:"^[0-9]*$"。只能輸入n位的數字:"^\d{...
相關文章
- Advantages of Being a Teacher英語作文
- Dreamweaver中JavaScript行為操作使用方法
- Java語言接口interface
- javascript中setInterval的用法總結
- java如何利用java.net.URLConnection發送HTTP請求
- 私家車的壞處The Disadvantages of Private Cars英語作文
- JavaScript在Android的WebView中parseInt函數轉換不正確
- Dreamweaver中JavaScript行為操作使用的總結
- 英語閲讀:African Union Leaders Talk Mali, Chinese Investmen
- Dreamweaver中JavaScript行為操作