Android的JNI調用(三)

來源:互聯網
上載者:User

標籤:bsp   native   不能   搜尋   oid   style   函數   load   system   

註冊JNI函數

  註冊之意就是將Java層的native函數與JNI層對應的實現函數關聯起來,這樣在調用Java層的native函數時,就能順利轉到JNI層對應的函數執行。

(1)靜態註冊

  根據函數名來找對應的JNI函數,需要java工具程式javah參與;

  缺點是每個class都需要使用javah產生一個標頭檔,並且產生的名字人很長書寫不便;初次調用時需要根據名字搜尋對應的JNI層函數來建立關聯關係,會影響運行效率。

(2)動態註冊

  使用AndroidRunTime類提供的registerNaitveMethods將getMethods來完成註冊工作,實際上最終調用的是(*env)->RegisterNative(env, clazz, gMethods, numMethods)。那麼何時調用註冊函數呢?一般Java層調用System.loadLibrary的時候,JNI層會調用JNI_OnLoad,動態註冊工作在這裡完成。

 

關於JNIEnv:

  JNIEnv是一個線程相關的,也就是說線程A有個JNIEnv,線程B有個JNIEnv。由於線程相關不能在B線程中去訪問線程A的JNIEnv結構體。但是全進程只有一個JavaVM對象,所以可以儲存並且在任何地方使用都沒有問題。

  調用JavaVM的AttachCurrentThread函數,就可以得到這個線程的JNIEnv結構體。這樣就可以在後台線程中回調Java函數。在後台線程退出前,需要調用JavaVM的DetachCurrentThread函數來釋放對應的資源。

 

Android的JNI調用(三)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.