閑聊c/c++ 3: 用c/c++混合編程方式為ios/android實(shí)現(xiàn)一個(gè)自繪日期選擇控件(三)

三、Android版本:

android_calendar.jpg

1歌逢、ndk開發(fā)必要的基礎(chǔ)知識(shí):
原本想配套寫一下ndk開發(fā)方面的基礎(chǔ)和步驟签杈,但老實(shí)說,這也并非三言兩語就能描述清楚的沽一,好在簡(jiǎn)書上已經(jīng)有現(xiàn)存的文章了未辆,經(jīng)過該作者同意,本人就引用一下:@zzyyppqq,thanks

關(guān)于開發(fā)工具的選擇

2014年的時(shí)候锯玛,基本都是使用eclipse來開發(fā)咐柜,使用android mk來編譯ndk程序。但是目前都是使用AndroidStudio做為開發(fā)和編譯ndk的工具攘残,因此我們關(guān)注AndroidStudio上的實(shí)現(xiàn)和編譯拙友。

.mk構(gòu)建系統(tǒng)demo

zzyyppqq-超級(jí)簡(jiǎn)單的Android Studio jni 實(shí)現(xiàn)(無需命令行)
通過使用ndk提供的工具來編譯ndk程序。
根據(jù)上述文檔歼郭,總結(jié)一下開發(fā)ndk的流程以及編譯過程:

1) public native String getString();在類中用native關(guān)鍵字聲明一個(gè)成員方法
2) 調(diào)用javah程序遗契,自動(dòng)生成navtie方法對(duì)應(yīng)的.h文件,得到可怕的c/c++函數(shù)原型:
   JNIEXPORT jstring JNICALL Java_com_zhangyp_higo_myndk_MyNdk_getString (JNIEnv *, jobject);
3) 在.c或.cpp文件中實(shí)現(xiàn)上面javah自動(dòng)生成的函數(shù)
4) 編寫mk文件病曾,用于編譯生成.so(類linux系統(tǒng)的動(dòng)態(tài)鏈接庫)文件
   包括Application.mk和android.mk這兩個(gè)mk文件
5) 你可以先調(diào)用一下ndk-build clear命令清理一下工程緩存之類的(有時(shí)不清理會(huì)出現(xiàn)一些問題),然后再調(diào)用ndk-build命令用于生成.so文件
6) 在android 類中使用static { System.loadLibrary("MyLibrary"); }方式牍蜂,將剛才生成的.so加載進(jìn)來漾根,然后就按照正常的android開發(fā)流程進(jìn)行native函數(shù)調(diào)用了。

由此可見鲫竞,Ndk的開發(fā)也不是很難辐怕,只要記住上面幾個(gè)步驟,就可以進(jìn)行簡(jiǎn)單的ndk開發(fā)从绘。

要點(diǎn):能夠被java調(diào)用的c/c++庫必須是以.so動(dòng)態(tài)鏈接庫方式鏈接進(jìn)來的寄疏,但是在ios開發(fā)中,必須要使用.lib靜態(tài)鏈接庫方式鏈入僵井,這是兩者很大的區(qū)別陕截。
技術(shù)在發(fā)展,時(shí)代在進(jìn)步批什。隨著AndroidStudio的普及农曲,引入了新的構(gòu)建系統(tǒng):gradle系統(tǒng)后,我們可以不用寫.mk文件了
要知道驻债,一個(gè)稍微復(fù)雜一點(diǎn)的ndk項(xiàng)目乳规,要在.mk中撰寫很多命令,單單.mk命令參考就有n多頁却汉,太可怕了Q蓖!
gradle構(gòu)建系統(tǒng)Demo

zzyyppqq-Android Studio使用gradle-experimental構(gòu)建NDK工程(無需Android.mk合砂、Application.mk文件)

gradle構(gòu)建注意點(diǎn):
1) gradle使用ndk編譯青扔,必須要使用:gradle-experimental 插件,這個(gè)需要到android相關(guān)網(wǎng)站去下載的
2) 一定要注意gradle-experimental的版本號(hào)與gradle的對(duì)應(yīng)關(guān)系翩伪,不能搞混了微猖。曾經(jīng)我因?yàn)闆]注意這一點(diǎn),導(dǎo)致掉在坑里兩天沒出來缘屹。太痛苦了(見下圖說明)凛剥。
3) 一定要按照上文提到的步驟曾我,一步步設(shè)置客们,zzyyppqq的gradle設(shè)置流程很清楚,就當(dāng)武功口訣來使用丝蹭,否則掉在坑里你也不知道怎么回事互亮。
4) 代碼的開發(fā)流程和.mk demo差不多犁享,只是不需要編寫.mk文件以及調(diào)用ndk-build命令了,這是使用gradle-experimental獲得的最大好處豹休。

再次強(qiáng)調(diào)一下:

gradle-experimental插件與gradle的版本號(hào)對(duì)應(yīng)關(guān)系圖:

對(duì)應(yīng)關(guān)系圖.png

gradle構(gòu)建文檔參考炊昆,請(qǐng)戳這里

使用gradle構(gòu)建系統(tǒng)后,雖然省掉了.mk文件的撰寫,但是很麻煩:
1)需要在java類中用native聲明方法
2)需要用Javah生成.h頭文件
3)需要在實(shí)現(xiàn).h中的函數(shù)時(shí)候凤巨,很熟悉java中的數(shù)據(jù)類型和c/c++中的數(shù)據(jù)類型之間的對(duì)應(yīng)關(guān)系
例如JNIEnv视乐,jobject,jstring等敢茁,還有其他很多數(shù)據(jù)類型佑淀,可以自己參看ndk開發(fā)文檔。
4)需要有時(shí)調(diào)用如此長(zhǎng)名字的函數(shù):Java_com_zhangyp_higo_myndk_MyNdk_getString

有沒有辦法解決上面提到的那些問題呢?

.........我們的豬腳.......SWIG庫......出場(chǎng)了......

有了SWIG后卷要,我們就可以正常方式編寫C/C++代碼渣聚,然后自動(dòng)包裝成ndk jni調(diào)用独榴,不需要了解android ndk數(shù)據(jù)類型僧叉,不需要javah調(diào)用,也不需要native聲明棺榔,Let's go! go! go! go!

2瓶堕、SWIG篇章:

SWIG簡(jiǎn)介:

SWIG全稱是Simplified Wrapper and Interface Generator,官方網(wǎng)站是http://www.swig.org/症歇。SWIG是一個(gè)開發(fā)工具郎笆,能夠?qū)⑹褂肅或者C++編寫的軟件與其他各種高級(jí)編程語言進(jìn)行嵌入聯(lián)接。

SWIG目前支持輸出的語言列表:
SWIG_Code_Generation.png
SWIG的安裝:
1)很簡(jiǎn)單忘晤,官網(wǎng)下載宛蚓,解壓到**最好沒有中文字符的**文件夾下
2)由于要使用swig.exe命令行程序,最好設(shè)置一下環(huán)境變量
3) 在命令行中輸入swig -help设塔,出現(xiàn)各種命令參數(shù)凄吏,說明環(huán)境變量設(shè)置成功。
Path環(huán)境變量.png
AndroidStudio與SWIG配合流程:
1) 嚴(yán)格按照zzyyppqq的文檔配置好gradle以及gradle-experimental的參數(shù)
2) 在AndroidStudio中按zzyyppqq文檔創(chuàng)建jni文件夾
3) 將用c/c++混合編程方式為ios/android實(shí)現(xiàn)一個(gè)自繪日期選擇控件(一)中的
    calendarCore.h和calendarCore.cpp文件復(fù)制到j(luò)ni文件夾下面,如下圖:
as_jni_swig.png
4)  編寫swig.i文件(接口文件)闰蛔,用于描述如何輸出.h文件為java接口痕钢,.i表示interface
swig_i.png
5) 編寫generate.bat文件用于調(diào)用swig.exe自動(dòng)生成接口文件(很多個(gè),具體我們圖示)

interface_gen.png

雙擊運(yùn)行bat前后效果如下:

bat前后對(duì)比圖.png
 6) swig轉(zhuǎn)換的流程分析:
流程.png
7) c/c++中的struct和class會(huì)自動(dòng)生成java對(duì)應(yīng)的類序六,并自動(dòng)添加(如果需要的話)get/set函數(shù):請(qǐng)查看CGPoint.java SCalendar.java等源碼

8) c/c++中的輸出參數(shù)任连,例如void calendar_get_year_month(SCalendar* calendar,int* year,int* month);
int* year 和 int* month是傳地址方式,將結(jié)果傳出來例诀,對(duì)于java來說随抠,必須要裝箱(boxing)以及拆箱(unboxing)
將int傳值方式變?yōu)閭饕梅绞剑虼俗詣?dòng)生成了SWIG_TYPE_p_int.java類繁涂,用于將值類型變?yōu)橐妙愋?
到此為止拱她,SWIG的使命已經(jīng)完成了,接下來純粹屬于Android java的控件開發(fā)爆土,其中會(huì)經(jīng)常調(diào)用上面分析過的由SWIG自動(dòng)生成的Java類椭懊。

3、 Android版Calendar的源碼:
源碼不再分析,實(shí)現(xiàn)細(xì)節(jié)可以參考
用c/c++混合編程方式為ios/android實(shí)現(xiàn)一個(gè)自繪日期選擇控件-IOS實(shí)現(xiàn)
Android版所有的源碼請(qǐng)狠狠地戳這里
https://github.com/jackyblf/

4氧猬、 到此背犯,c/c++結(jié)合ios/android原生開發(fā)的文章結(jié)束了,花了兩個(gè)禮拜盅抚,將近13000字漠魏。也算是嘔心瀝血吧。 如果覺得有用妄均,請(qǐng)關(guān)注我一下柱锹,謝謝

說明:
關(guān)于一些原創(chuàng)的文章,除非是一些第三方經(jīng)典源碼分析丰包,否則我一定會(huì)提供相應(yīng)的demo禁熏。

Next:

前段時(shí)間一直在用nodejs,非常爽的體驗(yàn)邑彪。
nodejs主要由google v8引擎以及l(fā)ibuv構(gòu)成瞧毙。
下一篇blog,隨風(fēng)來分析一下libuv的實(shí)現(xiàn)原理和一些技術(shù)關(guān)鍵點(diǎn)寄症。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末宙彪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子有巧,更是在濱河造成了極大的恐慌释漆,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件篮迎,死亡現(xiàn)場(chǎng)離奇詭異男图,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)柑潦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門享言,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人渗鬼,你說我怎么就攤上這事览露。” “怎么了譬胎?”我有些...
    開封第一講書人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵差牛,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我堰乔,道長(zhǎng)偏化,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任镐侯,我火速辦了婚禮侦讨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己韵卤,他們只是感情好骗污,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著沈条,像睡著了一般需忿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蜡歹,一...
    開封第一講書人閱讀 50,096評(píng)論 1 291
  • 那天屋厘,我揣著相機(jī)與錄音,去河邊找鬼月而。 笑死汗洒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的景鼠。 我是一名探鬼主播仲翎,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼痹扇,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼铛漓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鲫构,我...
    開封第一講書人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤浓恶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后结笨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體包晰,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年炕吸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了伐憾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赫模,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瀑罗,到底是詐尸還是另有隱情胸嘴,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布斩祭,位于F島的核電站劣像,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏摧玫。R本人自食惡果不足惜耳奕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧屋群,春花似錦时迫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至纸肉,卻和暖如春溺欧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背柏肪。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工姐刁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人烦味。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓聂使,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親谬俄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子柏靶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,871評(píng)論 25 707
  • Android游戲開發(fā)實(shí)踐(1)之NDK與JNI開發(fā)02 承接上篇Android游戲開發(fā)實(shí)踐(1)之NDK與JNI...
    AlphaGL閱讀 3,744評(píng)論 0 24
  • demo鏈接在文末。 在Android Studio中有3種方法生成so文件溃论。 最初的時(shí)候屎蜓,我曾經(jīng)使用過Visua...
    梧葉已秋聲閱讀 33,673評(píng)論 5 26
  • 行走的畫報(bào) 花帽 分衩長(zhǎng)條紋衫 焦藍(lán)闊腿褲 街頭 束腰大褂 白稠飄裙 舒適毛衫 薄綠長(zhǎng)裙 像水紋,細(xì)長(zhǎng)腿若現(xiàn) 嫵媚...
    _覓小金桔閱讀 259評(píng)論 0 2
  • 兒子個(gè)頭已經(jīng)比我高不少了钥勋。這是和兒子打球的時(shí)候媳看著我們爺倆搶球的時(shí)候和我說的炬转,我的身高是184公分。現(xiàn)在這小子正...
    微笑的大富閱讀 208評(píng)論 0 0