如何通過JNI傳遞對象執行回調

來源:互聯網
上載者:User
 JNI的全稱是java native interface,用來調用某些特定於系統平台或者硬體的操作,但是它只能調用c/c++的代碼,若是其它語言代碼,只能通過c/c++進行二次調用。關於JNI的完整技術文檔,大家可以查看下面這個網址:http://java.sun.com/j2se/1.5.0/docs/guide/jni/ 下面我們看下JNI如何執行回呼函數:我們知道在c/c++回呼函數可以通過函數指標執行,但是在Java中已經沒有指標的概念,在這裡,我們先傳遞一個類對象給native函數,然後再dll中調用期望的函數即可。下面的這個例子中,我們通過回調傳遞一個字串給java,這在java和c/c++混合編程時傳遞dll內部的出錯或其他資訊到java層是很有用的。1.  首先建立一個java類檔案,封裝一個native函數和一個用於回調的函數package jni;

public class Log...{

    static...{
              System.loadLibrary("mylib");
    }
    
        //用來回調,輸出c代碼層的資訊
    public void output(String out)...{
               System.out.println(out);
    }
    
        //native函數,用來傳遞對象
       public native void test(Log log);
    
    public static void main(String[] args)...{
        Log log = new Log();
        
        log.test(log);    
    }
}2.  調用javah命令,產生對應的c/c++都檔案/**//* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/**//* Header for class jni_Log */

#ifndef _Included_jni_Log
#define _Included_jni_Log
#ifdef __cplusplus
extern "C" ...{
#endif
/**//*
 * Class:     jni_Log
 * Method:    test
 * Signature: (Ljni/Log;)V
 */
JNIEXPORT void JNICALL Java_jni_Log_test
  (JNIEnv *, jobject, jobject);

#ifdef __cplusplus
}
#endif
#endif
3.  利用vc和產生的標頭檔完成一個dll        #include <windows.h>

#include "jni_Log.h"

int WINAPI DllMain(HINSTANCE hInstance, DWORD fdwReasion,PVOID pvReserved)
...{
    return TRUE;
}

JNIEXPORT void JNICALL Java_jni_Log_test(JNIEnv * env, jobject obj, jobject log)
...{
    jclass cls = (*env)->GetObjectClass(env, log);
    jmethodID jmid = (*env)->GetMethodID(env, cls, "output", "(Ljava/lang/String;)V");
    jstring info = (*env)->NewStringUTF(env, "i am a error!");
    (*env)->CallVoidMethod(env,log, jmid,info);
    (*env)->ReleaseStringUTFChars(env,info,(*env)->GetStringUTFChars(env, info, FALSE));
}

                 編譯完成後,將mylib.dll放到與jni同級的目錄中,運行命令java jni.Log,即可看到控制台成功列印資訊

                "i am a error!"。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.