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

      網友投稿 988 2022-05-30

      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函數,用來傳遞Log對象,在jni中調用Log對象的output方法

      public native void test(Log log);

      public static void main(String[] args){

      Log log = new Log();

      log.test(log);

      }

      }

      /* DO NOT EDIT THIS FILE - it is machine generated */

      #include

      /* Header for class jni_Log */

      #ifndef _Included_jni_Log

      #define _Included_jni_Log

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

      #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

      #include

      #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);//得到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));

      }

      C++ Java

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:Python:pendulum庫處理時間
      下一篇:關于HBuilderX的簡單介紹
      相關文章
      久久精品国产亚洲av瑜伽| 精品国产日韩久久亚洲| 亚洲乱码一二三四五六区| 亚洲最大AV网站在线观看| 爱爱帝国亚洲一区二区三区| 亚洲色欲色欱wwW在线| 99亚偷拍自图区亚洲| 中文字幕乱码亚洲无线三区| 亚洲 欧洲 日韩 综合在线| 国产精品亚洲片夜色在线 | 亚洲精品在线不卡| 91精品国产亚洲爽啪在线观看| 亚洲v高清理论电影| 亚洲一区二区在线免费观看| 亚洲最新视频在线观看| 亚洲黑人嫩小videos| 亚洲成综合人影院在院播放| 亚洲免费二区三区| 国产精品亚洲片在线va| 亚洲中文字幕无码亚洲成A人片| 亚洲中文字幕一区精品自拍| 亚洲AV综合色区无码一二三区| 欧美亚洲国产SUV| 亚洲视频中文字幕在线| 亚洲白色白色在线播放| 亚洲一区二区三区高清视频| 亚洲熟妇无码八V在线播放| 亚洲AV无码专区亚洲AV桃| 亚洲AV无码专区日韩| 亚洲精品无码AV中文字幕电影网站| 2048亚洲精品国产| 国产亚洲精品a在线观看app| 亚洲五月六月丁香激情| 亚洲人成毛片线播放| 在线aⅴ亚洲中文字幕| 亚洲综合一区无码精品| 亚洲精品V天堂中文字幕| 亚洲AV无码一区二区三区在线观看| 77777亚洲午夜久久多人| 亚洲国产精品人久久| 亚洲国产精品无码久久久|