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

 
JNI的全稱是java native interface,用來調用某些特定於系統平臺或者硬件的操做,可是它只能調用c/c++的代碼,如果其它語言代碼,只能經過c/c++進行二次調用。
關於JNI的完整技術文檔,你們能夠查看下面這個網址:
 
下面咱們看下JNI如何執行回調函數:
咱們知道在c/c++回調函數能夠經過函數指針執行,可是在Java中已經沒有指針的概念,在這裏,咱們先傳遞一個類對象給native函數,而後再dll中調用指望的函數便可。
下面的這個例子中,咱們經過回調傳遞一個字符串給java,這在java和c/c++混合編程時傳遞dll內部的出錯或其餘信息到java層是頗有用的。
1.  首先建立一個java類文件,封裝一個native函數和一個用於回調的函數


  1. package jni;

  2. public class Log{

  3.     static{
  4.               System.loadLibrary("mylib");
  5.     }
  6.     
  7.         //用來回調,輸出c代碼層的信息

  8.     public void output(String out){
  9.                System.out.println(out);
  10.     }
  11.     
  12.         //native函數,用來傳遞對象

  13.        public native void test(Log log);
  14.     
  15.     public static void main(String[] args){
  16.         Log log = new Log();
  17.         
  18.         log.test(log);
  19.     }
  20. }

2.  調用javah命令,生成對應的c/c++都文件


  1. /* DO NOT EDIT THIS FILE - it is machine generated */
  2. #include <jni.h>
  3. /* Header for class jni_Log */

  4. #ifndef _Included_jni_Log
  5. #define _Included_jni_Log
  6. #ifdef __cplusplus
  7. extern "C" {
  8. #endif
  9. /*
  10.  * Class: jni_Log
  11.  * Method: test
  12.  * Signature: (Ljni/Log;)V
  13.  */
  14. JNIEXPORT void JNICALL Java_jni_Log_test
  15.   (JNIEnv *, jobject, jobject);

  16. #ifdef __cplusplus
  17. }
  18. #endif
  19. #endif

 
3.  利用vc和生成的頭文件完成一個dll


  1. #include <windows.h>

  2. #include "jni_Log.h"

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

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


     編譯完成後,將mylib.dll放到與jni同級的目錄中,運行命令java jni.Log,便可看到控制檯成功打印信息css

                "i am a error!"。java

相關文章
相關標籤/搜索