Android開發(fā)實踐:Java層與Jni層的數(shù)組傳遞

原創(chuàng)作品,允許轉(zhuǎn)載朦肘,轉(zhuǎn)載時請務必以超鏈接形式標明文章 原始出處 秩霍、作者信息和本聲明耸别。否則將追究法律責任。http://ticktick.blog.51cto.com/823160/1360240

Android開發(fā)中,經(jīng)常會在Java代碼與Jni層之間傳遞數(shù)組(byte[]),一個典型的應用是Java層把需要發(fā)送給客戶端的數(shù)據(jù)流傳遞到Jni層,由Jni層的Socket代碼發(fā)送出去赁项,當然,Jni層也需要把從Socket接收到的數(shù)據(jù)流返回給Java層澈段。我簡單地總結(jié)了一下悠菜,從Java層到Jni層,從Jni層到JAVA層败富,各有3種傳遞方式悔醋,下面用代碼示例簡單地介紹一下。

示例代碼的主要文件有兩個兽叮,一個是Native.java芬骄,是Java層的類;另一個是Native.c鹦聪,是JNI層的文件账阻,關鍵的地方我都用注釋添加到代碼中了,完整的代碼見博文后面的附件泽本。

一淘太、 從Java傳遞數(shù)組到Jni層


Jni層接收到Java層傳遞過來的byte[]數(shù)組,一般有2個函數(shù)來獲取它的值规丽,一個 GetByteArrayRegion蒲牧,另一個是 GetByteArrayElements ,前者是進行值拷貝赌莺,將Java端數(shù)組的數(shù)據(jù)拷貝到本地的數(shù)組中冰抢,后者是指針的形式,將本地的數(shù)組指針直接指向Java端的數(shù)組地址艘狭,其實本質(zhì)上是JVM在堆上分配的這個數(shù)組對象上增加一個引用計數(shù)挎扰,保證垃圾回收的時候不要釋放翠订,從而交給本地的指針使用,使用完畢后指針一定要記得通過ReleaseByteArrayElements進行釋放遵倦,否則會產(chǎn)生內(nèi)存泄露尽超。

首先看Native.java的定義:

Paste_Image.png

再看看對應的native.c的實現(xiàn)代碼:

Paste_Image.png

二、 從Jni層傳遞數(shù)組到Java層


把Jni層定義的數(shù)組傳遞到Java層骇吭,一般有兩種方法橙弱,一種是通過native函數(shù)的返回值來傳遞歧寺,另一種是通過jni層回調(diào)java層的函數(shù)來傳遞燥狰,后者多用于jni的線程中。無論哪種方法斜筐,都離不開 SetByteArrayRegion 函數(shù)龙致,該函數(shù)將本地的數(shù)組數(shù)據(jù)拷貝到了 Java 端的數(shù)組中。下面只介紹前一種方式顷链,即通過native函數(shù)返回值的方式傳遞jni層的數(shù)組目代,回調(diào)的方式其實用法類似,就不詳細介紹了嗤练。

首先看Native.java的定義:

Paste_Image.png

再看看native.c是如何實現(xiàn)的:

Paste_Image.png

由上述代碼示例可以看出榛了,首先通過 NewByteArray 在堆上分配數(shù)組對象,然后通過SetByteArrayRegion 把本地的數(shù)組數(shù)據(jù)拷貝到堆上分配的數(shù)組中去煞抬,然后通過返回值將分配的數(shù)組對象返回到Java層即可霜大。對于回調(diào)的方式,這幾步操作也是一樣的革答,唯一的不同是战坤,回調(diào)方式不是以返回值的方式將數(shù)組對象返回給Java層,而是在回調(diào)函數(shù)中残拐,以回調(diào)函數(shù)參數(shù)的形式返回給Java層途茫。

三、 Direct Buffer 方式傳遞


Java和Jni層的數(shù)組傳遞還有一個比較重要的方式溪食,就是通過Direct Buffer來傳遞囊卜,這種方式類似于在堆上創(chuàng)建創(chuàng)建了一個Java和Jni層共享的整塊內(nèi)存區(qū)域,無論是Java層或者Jni層均可訪問這塊內(nèi)存错沃,并且Java端與Jni端同步變化边败,由于是采用的是共享內(nèi)存的方式,因此相比于普通的數(shù)組傳遞捎废,效率更高笑窜,但是由于構(gòu)造/析構(gòu)/維護這塊共享內(nèi)存的代價比較大,所以小數(shù)據(jù)量的數(shù)組建議還是采用上述方式登疗,Direct Buffer方式更適合長期使用頻繁訪問的大塊內(nèi)存的共享排截。具體使用方法介紹如下:

首先看Native.java的定義:

Paste_Image.png

再看看native.c是如何實現(xiàn)的:

Paste_Image.png

由上述代碼可以看出嫌蚤,其中使用起來還是很簡單的,Jni層只需要通過GetDirectBufferAddress函數(shù)即可獲取到這塊共享的內(nèi)存的地址断傲,Direct Buffer的管理工作均由操作系統(tǒng)來負責脱吱。

四、 總結(jié)


關于Java與Jni層的數(shù)組傳遞就介紹到這里了认罩,其實并不復雜箱蝠,希望上述代碼對初學者能有所幫助,有任何疑問或者不清楚的地方歡迎留言或者來信lujun.hust@gmail.com交流垦垂,或者關注我的新浪微博 @盧_俊 獲取最新的文章和資訊宦搬。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市劫拗,隨后出現(xiàn)的幾起案子间校,更是在濱河造成了極大的恐慌,老刑警劉巖页慷,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件憔足,死亡現(xiàn)場離奇詭異,居然都是意外死亡酒繁,警方通過查閱死者的電腦和手機滓彰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來州袒,“玉大人揭绑,你說我怎么就攤上這事∥任觯” “怎么了洗做?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長彰居。 經(jīng)常有香客問我诚纸,道長,這世上最難降的妖魔是什么陈惰? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任畦徘,我火速辦了婚禮,結(jié)果婚禮上抬闯,老公的妹妹穿的比我還像新娘井辆。我一直安慰自己,他們只是感情好溶握,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布杯缺。 她就那樣靜靜地躺著,像睡著了一般睡榆。 火紅的嫁衣襯著肌膚如雪萍肆。 梳的紋絲不亂的頭發(fā)上袍榆,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機與錄音塘揣,去河邊找鬼包雀。 笑死,一個胖子當著我的面吹牛亲铡,可吹牛的內(nèi)容都是我干的才写。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼奖蔓,長吁一口氣:“原來是場噩夢啊……” “哼赞草!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起锭硼,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤房资,失蹤者是張志新(化名)和其女友劉穎蜕劝,沒想到半個月后檀头,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡岖沛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年暑始,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片婴削。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡廊镜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出唉俗,到底是詐尸還是另有隱情嗤朴,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布虫溜,位于F島的核電站雹姊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏衡楞。R本人自食惡果不足惜吱雏,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瘾境。 院中可真熱鬧歧杏,春花似錦、人聲如沸迷守。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽兑凿。三九已至凯力,卻和暖如春眨业,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背沮协。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工龄捡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人慷暂。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓聘殖,卻偏偏與公主長得像,于是被迫代替她去往敵國和親行瑞。 傳聞我的和親對象是個殘疾皇子奸腺,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容