成都創(chuàng)新互聯(lián)公司專注于企業(yè)營(yíng)銷型網(wǎng)站建設(shè)、網(wǎng)站重做改版、漢源網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5高端網(wǎng)站建設(shè)、電子商務(wù)商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為漢源等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。
1、ndk開(kāi)發(fā)必要的基礎(chǔ)知識(shí):
原本想配套寫(xiě)一下ndk開(kāi)發(fā)方面的基礎(chǔ)和步驟,但老實(shí)說(shuō),這也并非三言兩語(yǔ)就能描述清楚的,好在網(wǎng)上已經(jīng)有現(xiàn)存的文章了,經(jīng)過(guò)該作者同意,本人就引用一下:@zzyyppqq thanks
2014年的時(shí)候,基本都是使用eclipse來(lái)開(kāi)發(fā),使用android mk來(lái)編譯ndk程序。但是目前都是使用AndroidStudio做為開(kāi)發(fā)和編譯ndk的工具,因此我們關(guān)注AndroidStudio上的實(shí)現(xiàn)和編譯。
zzyyppqq-超級(jí)簡(jiǎn)單的Android Studio jni 實(shí)現(xiàn)(無(wú)需命令行)
通過(guò)使用ndk提供的工具來(lái)編譯ndk程序。
根據(jù)上述文檔,總結(jié)一下開(kāi)發(fā)ndk的流程以及編譯過(guò)程:
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) 編寫(xiě)mk文件,用于編譯生成.so(類linux系統(tǒng)的動(dòng)態(tài)鏈接庫(kù))文件 包括Application.mk和android.mk這兩個(gè)mk文件 5) 你可以先調(diào)用一下ndk-build clear命令清理一下工程緩存之類的(有時(shí)不清理會(huì)出現(xiàn)一些問(wèn)題),然后再調(diào)用ndk-build命令用于生成.so文件 6) 在android 類中使用static { System.loadLibrary("MyLibrary"); }方式,將剛才生成的.so加載進(jìn)來(lái),然后就按照正常的android開(kāi)發(fā)流程進(jìn)行native函數(shù)調(diào)用了。
由此可見(jiàn),Ndk的開(kāi)發(fā)也不是很難,只要記住上面幾個(gè)步驟,就可以進(jìn)行簡(jiǎn)單的ndk開(kāi)發(fā)。
技術(shù)在發(fā)展,時(shí)代在進(jìn)步。隨著AndroidStudio的普及,引入了新的構(gòu)建系統(tǒng):gradle系統(tǒng)后,我們可以不用寫(xiě).mk文件了 要知道,一個(gè)稍微復(fù)雜一點(diǎn)的ndk項(xiàng)目,要在.mk中撰寫(xiě)很多命令,單單.mk命令參考就有n多頁(yè),太可怕了!!
zzyyppqq-Android Studio使用gradle-experimental構(gòu)建NDK工程(無(wú)需Android.mk、Application.mk文件)
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)闆](méi)注意這一點(diǎn),導(dǎo)致掉在坑里兩天沒(méi)出來(lái)。太痛苦了(見(jiàn)下圖說(shuō)明)。 3) 一定要按照上文提到的步驟,一步步設(shè)置,zzyyppqq的gradle設(shè)置流程很清楚,就當(dāng)武功口訣來(lái)使用,否則掉在坑里你也不知道怎么回事。 4) 代碼的開(kāi)發(fā)流程和.mk demo差不多,只是不需要編寫(xiě).mk文件以及調(diào)用ndk-build命令了,這是使用gradle-experimental獲得的最大好處。
gradle構(gòu)建文檔參考,請(qǐng)戳這里
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開(kāi)發(fā)文檔。 4)需要有時(shí)調(diào)用如此長(zhǎng)名字的函數(shù):Java_com_zhangyp_higo_myndk_MyNdk_getString
2、SWIG篇章:
SWIG全稱是Simplified Wrapper and Interface Generator,官方網(wǎng)站是http://www.swig.org/。SWIG是一個(gè)開(kāi)發(fā)工具,能夠?qū)⑹褂肅或者C++編寫(xiě)的軟件與其他各種高級(jí)編程語(yǔ)言進(jìn)行嵌入聯(lián)接。
1)很簡(jiǎn)單,官網(wǎng)下載,解壓到**最好沒(méi)有中文字符的**文件夾下 2)由于要使用swig.exe命令行程序,最好設(shè)置一下環(huán)境變量 3) 在命令行中輸入swig -help,出現(xiàn)各種命令參數(shù),說(shuō)明環(huán)境變量設(shè)置成功。
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文件夾下面,如下圖:
4) 編寫(xiě)swig.i文件(接口文件),用于描述如何輸出.h文件為java接口,.i表示interface
5) 編寫(xiě)generate.bat文件用于調(diào)用swig.exe自動(dòng)生成接口文件(很多個(gè),具體我們圖示)
雙擊運(yùn)行bat前后效果如下:
6) swig轉(zhuǎn)換的流程分析:
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é)果傳出來(lái),對(duì)于java來(lái)說(shuō),必須要裝箱(boxing)以及拆箱(unboxing) 將int傳值方式變?yōu)閭饕梅绞?,因此自?dòng)生成了SWIG_TYPE_p_int.java類,用于將值類型變?yōu)橐妙愋?/pre>到此為止,SWIG的使命已經(jīng)完成了,接下來(lái)純粹屬于Android java的控件開(kāi)發(fā),其中會(huì)經(jīng)常調(diào)用上面分析過(guò)的由SWIG自動(dòng)生成的Java類。 3、 Android和ISO版Calendar的源碼:
Android源碼不再分析,實(shí)現(xiàn)細(xì)節(jié)可以參考
calendar IO實(shí)現(xiàn)
Android和IOS版所有的源碼請(qǐng)狠狠地戳這里
https://github.com/jackyblf/4、再次強(qiáng)調(diào)一下為什么用c/c++?;谔摂M機(jī)的源碼實(shí)在太容易反編譯了,c#/java/as3等代碼,借助于一些工具,不到一分鐘就可以將源碼和資源全部反編譯出來(lái)。大家可以下載一下微信android或faceu android版,反編譯后發(fā)現(xiàn),核心代碼都在.so文件中,好多.so文件啊!
5、 到此,c/c++結(jié)合ios/android原生開(kāi)發(fā)的文章結(jié)束了,花了兩個(gè)禮拜,將近13000字。也算是嘔心瀝血吧。 如果覺(jué)得有用,請(qǐng)關(guān)注我一下,謝謝
說(shuō)明:
關(guān)于一些原創(chuàng)的文章,除非是一些第三方經(jīng)典源碼分析,否則我一定會(huì)提供相應(yīng)的demo。
本文標(biāo)題:(android/swig實(shí)現(xiàn))用c/c++混合編程方式為ios/android實(shí)現(xiàn)一個(gè)自繪日期選擇控件(三)
本文鏈接:http://weahome.cn/article/jheepd.html