【移動(dòng)應(yīng)用開發(fā)技術(shù)】(androidswig實(shí)現(xiàn))用cc++混合編程方式為iosandroid實(shí)現(xiàn)一個(gè)自繪日期選擇控件(三)_第1頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】(androidswig實(shí)現(xiàn))用cc++混合編程方式為iosandroid實(shí)現(xiàn)一個(gè)自繪日期選擇控件(三)_第2頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】(androidswig實(shí)現(xiàn))用cc++混合編程方式為iosandroid實(shí)現(xiàn)一個(gè)自繪日期選擇控件(三)_第3頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】(androidswig實(shí)現(xiàn))用cc++混合編程方式為iosandroid實(shí)現(xiàn)一個(gè)自繪日期選擇控件(三)_第4頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】(androidswig實(shí)現(xiàn))用cc++混合編程方式為iosandroid實(shí)現(xiàn)一個(gè)自繪日期選擇控件(三)_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

【移動(dòng)應(yīng)用開發(fā)技術(shù)】(androidswig實(shí)現(xiàn))用cc++混合編程方式為iosandroid實(shí)現(xiàn)一個(gè)自繪日期選擇控件(三)

三、Android版本:1、ndk開發(fā)必要的基礎(chǔ)知識(shí):原本想配套寫一下ndk開發(fā)方面的基礎(chǔ)和步驟,但老實(shí)說,這也并非三言兩語就能描述清楚的,好在網(wǎng)上已經(jīng)有現(xiàn)存的文章了,經(jīng)過該作者同意,本人就引用一下:@zzyyppqqthanks2014年的時(shí)候,基本都是使用eclipse來開發(fā),使用androidmk來編譯ndk程序。但是目前都是使用AndroidStudio做為開發(fā)和編譯ndk的工具,因此我們關(guān)注AndroidStudio上的實(shí)現(xiàn)和編譯。zzyyppqq-超級(jí)簡(jiǎn)單的AndroidStudiojni實(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ā)。技術(shù)在發(fā)展,時(shí)代在進(jìn)步。隨著AndroidStudio的普及,引入了新的構(gòu)建系統(tǒng):gradle系統(tǒng)后,我們可以不用寫.mk文件了

要知道,一個(gè)稍微復(fù)雜一點(diǎn)的ndk項(xiàng)目,要在.mk中撰寫很多命令,單單.mk命令參考就有n多頁,太可怕了!!zzyyppqq-AndroidStudio使用gradle-experimental構(gòu)建NDK工程(無需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)闆]注意這一點(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構(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開發(fā)文檔。

4)需要有時(shí)調(diào)用如此長(zhǎng)名字的函數(shù):Java_com_zhangyp_higo_myndk_MyNdk_getString有了SWIG后,我們就可以正常方式編寫C/C++代碼,然后自動(dòng)包裝成ndkjni調(diào)用,不需要了解androidndk數(shù)據(jù)類型,不需要javah調(diào)用,也不需要native聲明,Let’sgo!go!go!go!2、SWIG篇章:SWIG全稱是SimplifiedWrapperandInterfaceGenerator,官方網(wǎng)站是/。SWIG是一個(gè)開發(fā)工具,能夠?qū)⑹褂肅或者C++編寫的軟件與其他各種高級(jí)編程語言進(jìn)行嵌入聯(lián)接。1)很簡(jiǎn)單,官網(wǎng)下載,解壓到**最好沒有中文字符的**文件夾下

2)由于要使用swig.exe命令行程序,最好設(shè)置一下環(huán)境變量

3)

在命令行中輸入swig

-help,出現(xiàn)各種命令參數(shù),說明環(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)

編寫swig.i文件(接口文件),用于描述如何輸出.h文件為java接口,.i表示interface5)

編寫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é)果傳出來,對(duì)于java來說,必須要裝箱(boxing)以及拆箱(unboxing)

將int傳值方式變?yōu)閭饕梅绞?,因此自?dòng)生成了SWIG_TYPE_p_int.java類,用于將值類型變?yōu)橐妙愋?、Android和ISO版Calendar的源碼:Android源碼不再分析,實(shí)現(xiàn)細(xì)節(jié)可以參考calendarIO實(shí)現(xiàn)Android和IOS版所有的源碼請(qǐng)狠狠地戳這里/jackyblf/4、再次強(qiáng)調(diào)一下為什么用c/c++?;谔摂M機(jī)的源碼實(shí)在太容易反編譯了,c#/java/as3等代碼,借助于一些工具,不到一分鐘就可以將源碼和資源全部反編譯出來。大家可以下載一下微信android或faceuandroid版,反編

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論