1. 程式人生 > >對AndroidRuntime的一點理解

對AndroidRuntime的一點理解

在Android原始碼, frameworks/base/core/jni/目錄下,有AndroidRuntime的原始碼,編譯後生成libandroid_runtime.so,這個動態庫非常重要。

裡面含有很多用c++寫的jni的方法,這些方法會被虛擬機器上層java檔案所呼叫,當我嘗試在其中找JNI_OnLoad函式時,卻沒有找到,通常jni開發時要在動態庫中匯出這個函式,這樣用System.loadLibrary才能通過它來註冊jni的方法,於是我的疑惑來了。開啟AndroidRuntime.cpp一看,裡面有一行:

static const RegJNIRec gRegJNI[] = {

這是一個數組,包含了所有的檔案裡的jni方法的註冊過程,繼續找到一行:

if (register_jni_procs(gRegJNI, NELEM(gRegJNI), env) < 0) {

說明register_jni_procs這個函式註冊了這個數組裡的所有過程。這行語句包含在startReg裡,再找到呼叫它的語句:

    /*
     * Register android functions.
     */
    if (startReg(env) < 0) {
而這就是位於start函式中:

/*
 * Start the Android runtime.  This involves starting the virtual machine
 * and calling the "static void main(String[] args)" method in the class
 * named by "className".
 */
void AndroidRuntime::start(const char* className, const bool startSystemServer)
{

這個函式負責start一個類中的main函式的工作。

我的理解是先啟動虛擬機器,然後註冊jni方法,給要執行的java class作準備,最後才執行java class裡的main函式。

應該說libandroid_runtime.so方法不是一個標準的jni庫,而是特殊的jni庫,它不能在一般的java檔案裡被通過System.loadLibrary引入,

似乎可以通過davikvm的命令列來呼叫java類,在java類的檔案main函式裡動態載入libandroid_runtime.so,然後註冊jni方法

這可以通過frameworks/base/core/com/android/internal/util/WithFramework.java來分析

相關推薦

AndroidRuntime一點理解

在Android原始碼, frameworks/base/core/jni/目錄下,有AndroidRuntime的原始碼,編譯後生成libandroid_runtime.so,這個動態庫非常重要。 裡面含有很多用c++寫的jni的方法,這些方法會被虛擬機器上層jav

事件循環的一點理解

.post require 順序 this ref abcd his cti 如何 最近工作需要學習了解webworker-threads以應對Javascript多線程處理CPU密集型的可能性;參考文檔JavaScript多線程之二 Node.js中的Web Worker

淺談後綴自動機的一點理解

字符串 變化 post .... 初始 mar 一起 樹狀 子集 後綴自動機入門詳解及模板

UIRect 的一點理解

mat wan function end height 默認 標記 targe 影響   UIRect,一個繼承 MonoBehaviour 的抽象類,主要實現了錨點功能。 2.1 UIRect 簡單介紹   UIRect 內實現了類 AnchorPoint,它保存了具體的

機器學習的一點理解

求導 分段 梯度下降法 部分 技術分享 直接 標註 sqrt 插件 ????機器是什麽,機器就是電腦、芯片、代碼這些東西。讓電腦遵循人的指令,完成一件特定的任務從計算機發明那天開始就在研究了,現在的各種編程語言、數據結構和編程算法等都是在做這個。但是它們只能依賴於程序員輸入

面向過程與面向象的一點理解

面向過程 -- 數據格式 一點 理解 格式 tro 數據 結構 面向過程  首先確定編程計算機應采取的操作,然後使用編程語言來實現這些操作。(使問題滿足語言) 面向對象  設計與問題的本質特性相對應的數據格式--類,對象是根據這種規範構造的特定數據結構。(使

求有向圖強連通分量的tarjan算法原理的一點理解

深度優先 含義 出現 組合 分支 ron 滿足 根節點 節點和 先簡單敘述一下tarjan算法的執行過程(其他諸如偽代碼之類的相關細節可以自己網上搜索,這裏就不重復貼出了): 用到兩類數組: dfs[]:DFS過程中給定節點的深度優先數,即該節點在DFS中被訪問的次序 lo

學習Java之關鍵字break和continue的一點理解

我們都知道關鍵字 ——   break 是 預設跳出當前距離此 break 最近的一個 for / while 迴圈語句塊 或  switch 開關語句塊; 例-1:跳出迴圈 for(;;) { while(true)

LightGBM的一點理解

LightGBM是微軟團隊2017年發表在NIPS的一篇論文,也是一種基於GBDT的Boosting的方法。之前有了各種Boosting方法,以及在各類資料比賽中大放異彩的XGBoost,LightGBM的優勢在哪裡呢? LightGBM是一種基於GBDT的提升方法。對

先驗後驗概率的一點理解

先驗概率是由某些起因推匯出結果發生的概率,如用在全概率公式中。 利用過去歷史資料計算得到的先驗概率,稱為客觀先驗概率; 當歷史資料無從取得或資料不完全時,憑人們的主觀經驗來判斷而得到的先驗概率,稱為主觀

梯度下降法和反向傳播BP的一點理解

       最近在學習深度學習中的梯度下降與反向傳播方面的知識。偶有心得,特此記錄。若有不足之處,煩請指正賜教。        在訓練階段,深度神經網路經過前向傳播之後,得到的預測值與先前給出真實值之間存在差距。我們可以使用損失函式來體現這種差距。損失函式的作用可以理解為

UIView動畫和Core Animation的關係的一點理解

http://www.jianshu.com/p/72f4cca98b0e 1、UIView動畫是應用在一個view上面的,一種是使用CATransition進行更低層次的控制,UIView方式可能在低層也是使用CATransition進行了封裝。 2、CABasic

創業的一點理解

      畢業不到三年,回首以前,剛畢業時,血氣方剛,對工作,未來充滿著幻想,不服一切的性格讓自己太過躁動,太盲目,用初生牛犢不怕虎形容,太合適了。覺得一切都不難,總感覺不做出一點自己的事業,是不能接受的狀態。所以,加班,業餘時間也花在了技術上,看了很多很多專業書

Dicom資料的一點理解

首先推薦一款用於解析顯示Dicom型別資料的軟體:RadiAntDICOMViewer,可以很全的顯示Dicom資料的tag值,簡單方便很實用。 Dicom資料由檔案資訊和資料兩部分組成: 1、資料

狀壓dp的一點理解

博主是初學者,以下僅代表個人觀點,若有錯誤歡迎指出。 狀壓dp       此dp可以理解為最暴力的dp,因為他需要遍歷每個狀態,所以將會出現2^n的情況數量,所以明顯的標誌就是資料不能太多(好像是<=16?),然後遍歷所有狀態的姿勢就是用二進位制來表示,01串,1表

UX的一點理解

轉場做了幾個星期的前端開發,突然對UX設計有了些看法,丟擲來,歡迎UX同學斧正。 個人理解的UX設計的幾個層次,或者一般會經歷的幾個階段: 1. 有一定的美術功底,會使用常用的設計軟體,UI元素運用熟練,線條、色彩、佈局、比例運用恰當。能夠按照統一規範製作頁

K-means運用到deep learning的一點理解

          最近,在學習與深度學習相關的論文,看了一位大牛的論文學習筆記後,決定也把自己學習和看到的整理下來,不知道個人的理解對不對,希望發現問題的親們能踴躍進行批評指正。          非監督學習的流程:             1.從一組無標籤資料中學習特徵

C語言中交換兩個數是否交換成功的一點理解

在學習指標的時候老師會給一個用變數做引數的交換兩個數小程式設計,但是,那個程式設計中兩個數的值交換前後卻沒有變化,然後老師由此引入指標。一開始我也不理解為什麼同樣的交換步驟,為什麼有時候可以有時候不可以,然後請教了師兄,師兄講的很好也很專業,可是我還是似懂非懂。。。然後,現

spring cloud config的一點理解

  以下部分純屬個人理解,但是結果都是經過demo驗證。 一、spring cloud config介紹   spring cloud是spring家族中的一個微服務工具包,其中包含了很多微服務的工具。偏向於與spring boot類似的配置方式,有許多許多預設配置。spring cloud config是其

全域性變數的multiple definition的一點理解

Q:使用#ifndef在標頭檔案中定義全域性變數,然後兩個.c檔案分別訪問(#include),編譯時就會出現multiple definition的提示,但是已經使用了條件編譯,理論上第二次應該跳過定義過程,這是為什麼呢? A:這類條件編譯是為了防止同