JAVA認(rèn)證基礎(chǔ)知識(shí):JavaNativeInterface學(xué)習(xí)小結(jié)

    時(shí)間:2024-07-08 19:00:28 JAVA認(rèn)證 我要投稿
    • 相關(guān)推薦

    JAVA認(rèn)證基礎(chǔ)知識(shí):JavaNativeInterface學(xué)習(xí)小結(jié)

      JNI是Java Native Interface的縮寫(xiě),中文為JAVA本地調(diào)用。使用JNI可以很方便的用我們的Java程序調(diào)用C/C++程序。很多時(shí)候,某些功能用Java無(wú)法實(shí)現(xiàn),比如說(shuō)涉及到底層驅(qū)動(dòng)的一些功能,這時(shí)候我們就可以利用JNI來(lái)調(diào)用C或者C++程序來(lái)實(shí)現(xiàn),這就是JNI的強(qiáng)大之處。但是JNI也有它的缺點(diǎn),使用java與本地已編譯的代碼交互,通常會(huì)喪失平臺(tái)可移植性。

    JAVA認(rèn)證基礎(chǔ)知識(shí):JavaNativeInterface學(xué)習(xí)小結(jié)

      下面是一個(gè)JNI例子,調(diào)用C++輸出"hello world":

      第一步:創(chuàng)建Java類(lèi),在里面定義一個(gè)本地方法(用native關(guān)鍵字修飾的方法)

      public native void sayHello();

      第二步:使用javah命令(javah 類(lèi)的全路徑)生成本地方法的C++頭文件

      在DOS窗口中進(jìn)入工程所在目錄,然后執(zhí)行javah com.test.TestNative命令,執(zhí)行完之后就會(huì)在當(dāng)前目錄生成一個(gè)后綴名為。h的頭文件,如com_test_TestNative.h,這個(gè)頭文件是根據(jù)包名和類(lèi)名來(lái)命名的。

      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行是對(duì)TestNative類(lèi)中的本地方法sayHello()的聲明。這個(gè)h文件相當(dāng)于我們?cè)趈ava里面的接口,這里聲明了一個(gè) Java_com_test_TestNative_sayHello (JNIEnv *, jobject);方法,然后在我們的本地方法里面實(shí)現(xiàn)這個(gè)方法,也就是說(shuō)我們?cè)诰帉?xiě)C/C++程序的時(shí)候所使用的方法名必須和這里的一致。

      第三步:編寫(xiě)C/C++本地代碼,生成動(dòng)態(tài)鏈接庫(kù)文件

      首先在VC6.0(當(dāng)然也可以用其他工具)中創(chuàng)建一個(gè)dll工程---Win32 Dynamic-Link Library工程。然后將上面生成的頭文件com_test_TestNative.h添加到該工程中,然后創(chuàng)建一個(gè)源文件引用該頭文件并且實(shí)現(xiàn)頭文件中本地函數(shù)的功能:

      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 }

      這里因?yàn)閏om_test_TestNative.h中引入了jni.h所以要將jni.h加入到VC6.0安裝目錄下的Include目錄中。jni.h在JDK安裝目錄下的include中,同時(shí)得件include/win32中的兩個(gè)頭文件jawt_md.h、jni_md.h也導(dǎo)入到 VC6.0中。

      將所依賴(lài)的頭文件導(dǎo)入之后,我們就可以構(gòu)建該工程了,按F7就行了,完了會(huì)在工程目錄中的Degug目錄下生成一個(gè)動(dòng)態(tài)鏈接庫(kù)文件,我這里生成的是NativeCode.dll.我們就可以將該dll文件拷貝到環(huán)境變量path所包含的目錄下給咱們的Java程序調(diào)用了,為了方便,我們也可以將 dll所在的工程目錄加入到環(huán)境變量path中去,這樣可以避免每次都要拷貝的麻煩。注意修改環(huán)境變量之后要重啟myeclipse.

      第四步:Java調(diào)用本地函數(shù)

      1 package com.test;

      2

      3 public class TestNative {

      4 public native void sayHello();

      5

      6 /**

      7 * @param args

      8 */

      9 public static void main(String[] args) {

      10 System.loadLibrary("NativeCode");

      11 TestNative tNative = new TestNative();

      12 tNative.sayHello();

      13 }

      14 }

      第10行是加載動(dòng)態(tài)鏈接庫(kù),JVM只需要加載一次就可以調(diào)用了,"NativeCode"是上面生成的動(dòng)態(tài)鏈接庫(kù)的名字,不含后綴名。

      運(yùn)行該程序,成功打印輸出了"hello world".

    【JAVA認(rèn)證基礎(chǔ)知識(shí):JavaNativeInterface學(xué)習(xí)小結(jié)】相關(guān)文章:

    JAVA認(rèn)證基礎(chǔ)知識(shí):Java獲取當(dāng)前的系統(tǒng)時(shí)間06-08

    Java認(rèn)證基礎(chǔ)知識(shí):java字符串轉(zhuǎn)化整型問(wèn)題07-21

    JAVA認(rèn)證簡(jiǎn)介10-02

    JAVA認(rèn)證基礎(chǔ)知識(shí):基于反射機(jī)制的服務(wù)代理調(diào)用09-20

    JAVA認(rèn)證基礎(chǔ)知識(shí):JSP使用數(shù)據(jù)庫(kù)操作06-10

    JAVA認(rèn)證考試細(xì)則06-10

    SUN JAVA認(rèn)證介紹12-18

    java認(rèn)證考試介紹07-31

    Java的基礎(chǔ)知識(shí)07-27

    91久久大香伊蕉在人线_国产综合色产在线观看_欧美亚洲人成网站在线观看_亚洲第一无码精品立川理惠

      午夜精品在线直播的视频网站 | 欧美理论一级在线免费看 | 午夜亚洲第一区 | 日本熟女中文字幕DVD | 网友自拍区在线视频精品 | 亚洲日韩欧美一区二区三区 |