1、ndk開發必要的基礎知識:
原本想配套寫一下ndk開發方面的基礎和步驟,但老實說,這也并非三言兩語就能描述清楚的,好在網上已經有現存的文章了,經過該作者同意,本人就引用一下:@zzyyppqq thanks
2014年的時候,基本都是使用eclipse來開發,使用android mk來編譯ndk程序。但是目前都是使用AndroidStudio做為開發和編譯ndk的工具,因此我們關注AndroidStudio上的實現和編譯。
zzyyppqq-超級簡單的Android Studio jni 實現(無需命令行)
通過使用ndk提供的工具來編譯ndk程序。
根據上述文檔,總結一下開發ndk的流程以及編譯過程:
1) public native String getString();在類中用native關鍵字聲明一個成員方法 2) 調用javah程序,自動生成navtie方法對應的.h文件,得到可怕的c/c++函數原型: JNIEXPORT jstring JNICALL Java_com_zhangyp_higo_myndk_MyNdk_getString (JNIEnv *, jobject); 3) 在.c或.cpp文件中實現上面javah自動生成的函數 4) 編寫mk文件,用于編譯生成.so(類linux系統的動態鏈接庫)文件 包括Application.mk和android.mk這兩個mk文件 5) 你可以先調用一下ndk-build clear命令清理一下工程緩存之類的(有時不清理會出現一些問題),然后再調用ndk-build命令用于生成.so文件 6) 在android 類中使用static { System.loadLibrary("MyLibrary"); }方式,將剛才生成的.so加載進來,然后就按照正常的android開發流程進行native函數調用了。
由此可見,Ndk的開發也不是很難,只要記住上面幾個步驟,就可以進行簡單的ndk開發。
技術在發展,時代在進步。隨著AndroidStudio的普及,引入了新的構建系統:gradle系統后,我們可以不用寫.mk文件了 要知道,一個稍微復雜一點的ndk項目,要在.mk中撰寫很多命令,單單.mk命令參考就有n多頁,太可怕了??!
zzyyppqq-Android Studio使用gradle-experimental構建NDK工程(無需Android.mk、Application.mk文件)
1) gradle使用ndk編譯,必須要使用:gradle-experimental 插件,這個需要到android相關網站去下載的 2) 一定要注意gradle-experimental的版本號與gradle的對應關系,不能搞混了。曾經我因為沒注意這一點,導致掉在坑里兩天沒出來。太痛苦了(見下圖說明)。 3) 一定要按照上文提到的步驟,一步步設置,zzyyppqq的gradle設置流程很清楚,就當武功口訣來使用,否則掉在坑里你也不知道怎么回事。 4) 代碼的開發流程和.mk demo差不多,只是不需要編寫.mk文件以及調用ndk-build命令了,這是使用gradle-experimental獲得的最大好處。
gradle構建文檔參考,請戳這里
1)需要在java類中用native聲明方法 2)需要用Javah生成.h頭文件 3)需要在實現.h中的函數時候,很熟悉java中的數據類型和c/c++中的數據類型之間的對應關系 例如JNIEnv,jobject,jstring等,還有其他很多數據類型,可以自己參看ndk開發文檔。 4)需要有時調用如此長名字的函數:Java_com_zhangyp_higo_myndk_MyNdk_getString
2、SWIG篇章:
SWIG全稱是Simplified Wrapper and Interface Generator,官方網站是http://www.swig.org/。SWIG是一個開發工具,能夠將使用C或者C++編寫的軟件與其他各種高級編程語言進行嵌入聯接。
1)很簡單,官網下載,解壓到**最好沒有中文字符的**文件夾下 2)由于要使用swig.exe命令行程序,最好設置一下環境變量 3) 在命令行中輸入swig -help,出現各種命令參數,說明環境變量設置成功。
1) 嚴格按照zzyyppqq的文檔配置好gradle以及gradle-experimental的參數 2) 在AndroidStudio中按zzyyppqq文檔創建jni文件夾 3) 將用c/c++混合編程方式為ios/android實現一個自繪日期選擇控件(一)中的 calendarCore.h和calendarCore.cpp文件復制到jni文件夾下面,如下圖:
4) 編寫swig.i文件(接口文件),用于描述如何輸出.h文件為java接口,.i表示interface
5) 編寫generate.bat文件用于調用swig.exe自動生成接口文件(很多個,具體我們圖示)
雙擊運行bat前后效果如下:
6) swig轉換的流程分析:
7) c/c++中的struct和class會自動生成java對應的類,并自動添加(如果需要的話)get/set函數:請查看CGPoint.java SCalendar.java等源碼 8) c/c++中的輸出參數,例如void calendar_get_year_month(SCalendar* calendar,int* year,int* month); int* year 和 int* month是傳地址方式,將結果傳出來,對于java來說,必須要裝箱(boxing)以及拆箱(unboxing) 將int傳值方式變為傳引用方式,因此自動生成了SWIG_TYPE_p_int.java類,用于將值類型變為引用類型
3、 Android和ISO版Calendar的源碼:
Android源碼不再分析,實現細節可以參考
calendar IO實現
Android和IOS版所有的源碼請狠狠地戳這里
https://github.com/jackyblf/
4、再次強調一下為什么用c/c++?;谔摂M機的源碼實在太容易反編譯了,c#/java/as3等代碼,借助于一些工具,不到一分鐘就可以將源碼和資源全部反編譯出來。大家可以下載一下微信android或faceu android版,反編譯后發現,核心代碼都在.so文件中,好多.so文件??!
5、 到此,c/c++結合ios/android原生開發的文章結束了,花了兩個禮拜,將近13000字。也算是嘔心瀝血吧。 如果覺得有用,請關注我一下,謝謝
說明:
關于一些原創的文章,除非是一些第三方經典源碼分析,否則我一定會提供相應的demo。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。