<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    歡迎使用我的 在線工具

    小D

    讀歷史、看小說、寫程序都是我所愛。技術(shù)不好,頭腦不靈光,靠的是興趣。
    隨筆 - 35, 文章 - 25, 評論 - 13, 引用 - 0
    數(shù)據(jù)加載中……

    JNI學(xué)習(xí)記錄

    ?

    1.???? JNIJava與本地C/C++代碼相互操作的一種方案。

    2.???? 要使用JNI,需要:

    1),在Java源程序中使用native關(guān)鍵字聲明一個方法。

    ???????? 如:public native void callCppFunction();

    2),然后在命令行提示符下使用javah這個命令來生成關(guān)于JNI的本地頭文件。

    如:javah test.jni.MainArrayTest

    ???????? 3),在VC Studio中建立一個DLL工程,拷貝這個頭文件到該工程目錄下,拷貝

    ???????? %JAVA_HOME%"include下面的jni.hjni_md.h到工程目錄下,或者加到系統(tǒng)目下,具體需要拷貝的頭文件還要具體研究。

    4),建一個cpp源文件,實(shí)現(xiàn)生成的頭文件中聲明的函數(shù)。

    5),具體各種函數(shù)及數(shù)據(jù)類型的使用如下:具體自己研究:

    l?????? 簡單方法調(diào)用,基本數(shù)據(jù)類型的使用

    jclass clazz_TestNative = env->GetObjectClass(obj);

    /*??????

    jfieldID id_number = env->GetFieldID(clazz_TestNative,

    ?????????? "number", "I");

    jint number = env->GetIntField(obj, id_number);

    cout<<number<<endl;

    env->SetIntField(obj, id_number, 1000L);

    */

    //??????? jmethodID id_max = env->GetMethodID(clazz_TestNative, "max", "(DD)D");

    //??????? jdouble maxValue = env->CallDoubleMethod(obj, id_max, 3.14, 3.15);

    //??????? cout<<maxValue<<endl;

    jfieldID id_person = env->GetFieldID(clazz_TestNative, "person", "Ltest/jni/Father;");

    jobject person = env->GetObjectField(obj, id_person);

    jclass clazz_Father = env->FindClass("test/jni/Father");

    jmethodID id_Father_Function = env->GetMethodID(clazz_Father, "function", "()V");

    env->CallVoidMethod(person, id_Father_Function);

    env->CallNonvirtualObjectMethod(person,clazz_Father, id_Father_Function);

    l?????? 對象的使用

    jclass clazz_date = env->FindClass("java/util/Date");

    jmethodID outputDate_ID = env->GetMethodID(clazz_date, "<init>", "()V");

    jobject date_obj = env->NewObject(clazz_date, outputDate_ID);

    jmethodID mid_date_getTime = env->GetMethodID(clazz_date, "getTime", "()J");

    unsigned times = env->CallLongMethod(date_obj, mid_date_getTime);

    //??????? printf("%u",times);

    cout<<times<<endl;

    l?????? 字符串的簡單實(shí)用

    jfieldID fid_msg = env->GetFieldID(env->GetObjectClass(obj), "message", "Ljava/lang/String;");

    jstring j_msg = (jstring)env->GetObjectField(obj, fid_msg);

    //const jchar *p_jst = env->GetStringChars(j_msg, NULL);

    //MessageBoxW(NULL,(const wchar_t *)p_jst, L"Title", MB_OK);

    jint len = env->GetStringLength(j_msg);

    jchar *j_buf = new jchar[len+1];

    j_buf[len] = L'"0';

    env->GetStringRegion(j_msg, 0, len, j_buf);??????

    wstring wstr((const wchar_t *)j_buf);

    //env->ReleaseStringChars(j_msg, j_buf);//不能釋放字符數(shù)組啊

    delete []j_buf;

    std::reverse(wstr.begin(), wstr.end());

    jstring jnewStr = env->NewString((const jchar*)wstr.c_str(), wstr.size());

    env->SetObjectField(obj, fid_msg, jnewStr);

    ??????????????????

    l?????? 數(shù)組的使用

    jfieldID fid_arrays = env->GetFieldID(env->GetObjectClass(obj), "arrays", "[I");

    jintArray jint_arr = (jintArray)env->GetObjectField(obj, fid_arrays);

    jint *int_arr = env->GetIntArrayElements(jint_arr, NULL);

    jsize len = env->GetArrayLength(jint_arr);

    for(int i = 0; i < len; ++i)

    {

    //?????? cout<<int_arr[i]<<endl;

    }

    sort(int_arr, int_arr + len, less_second);

    env->ReleaseIntArrayElements(jint_arr, int_arr, /*JNI_ABORT/JNI_COMMIT/0*/0);

    }

    bool less_second(const int & m1, const int & m2)

    {

    ??????? return m1 > m2;

    }

    上面要注意在JNI中對Java中數(shù)據(jù)類型的映射,見頭文件的聲明。

    還有注意Java中關(guān)于對象類型的表示方法比如:int I, boolean Z,

    Object L<類的完整名稱,注意包名以/分隔>;,數(shù)組[<數(shù)據(jù)類型>

    如果不知道可以使用javap這個反編譯器。

    ????????

    ???????? 6)、更多資料,將Java手冊。

    ???????? 7)、編譯,生成DLL。將DLL的文件路徑加到Path環(huán)境變量下:

    ???????? 8)、在Main函數(shù)中加載動態(tài)庫。

    如:System.loadLibrary("TestNative4"),注意不要DLL擴(kuò)展名,為了跨平臺嘛!

    9)、如果使用的是eclipse之類的IDE工具,請重啟,因?yàn)樵擃惞ぞ咴趩訒r,默認(rèn)讀取了系統(tǒng)變量,但是不會監(jiān)視變量的變化。

    10)、注意在JNI中對Java對象的引用。不然垃圾回收將會產(chǎn)生問題。注意全局引用,局部引用、弱全局引用的使用。

    ?????????? 局部引用,也就是本地方法中返回引用。應(yīng)該使用DeleteLocalRef釋放該引用。NewLocalRef創(chuàng)建。還用很多方式創(chuàng)建。

    ?????????? 全局引用,需要手動釋放,防止垃圾回收器回收。需要使用NewGlobalRef函數(shù)創(chuàng)建,釋放它需要使用DeleteGlobalRef函數(shù)。

    ?????????? 弱全局引用,需要編程人員手動釋放,但是它不防止垃圾回收器的回收。

    ?????????? 使用NewWeakGlobalRef創(chuàng)建,使用DeleteWeakGlobalref釋放。IsSamObject(jobject obj1, jobject obj2)判斷弱全局引用指向的對象是否已被回收。

    posted on 2009-11-04 18:44 vagasnail 閱讀(6430) 評論(0)  編輯  收藏 所屬分類: JavaEE


    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 久久99精品免费视频| 四虎成人免费影院网址| 久久精品国产亚洲AV忘忧草18| 夭天干天天做天天免费看| 免费人成大片在线观看播放电影 | 精品在线视频免费| 亚洲av色福利天堂| 日韩在线免费看网站| 在线成人精品国产区免费| 国产成+人+综合+亚洲专| 久久久久亚洲AV成人网人人网站| 久久精品人成免费| 免费看一级毛片在线观看精品视频| 亚洲最大福利视频网站| 一级毛片直播亚洲| 99国产精品永久免费视频| 亚洲精品偷拍视频免费观看| 亚洲男人的天堂久久精品| 国产亚洲精品资源在线26u| 日本免费一区尤物| 51在线视频免费观看视频| kk4kk免费视频毛片| 亚洲同性男gay网站在线观看| 亚洲伊人久久综合中文成人网| 最新猫咪www免费人成| 无码一区二区三区免费| 日本一区二区三区在线视频观看免费 | 国产国产成年年人免费看片| 免费无码一区二区三区| xvideos永久免费入口| 亚洲偷自拍另类图片二区| 亚洲一本综合久久| 亚洲色欲色欲www在线丝| 四虎影院永久免费观看| 日韩免费精品视频| 免费无码毛片一区二区APP| 岛国岛国免费V片在线观看| 黄色毛片免费在线观看| 亚洲欧美成人av在线观看| 亚洲日韩中文字幕| 久久亚洲春色中文字幕久久久|