




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(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í)說(shuō),這也并非三言兩語(yǔ)就能描述清楚的,好在網(wǎng)上已經(jīng)有現(xiàn)存的文章了,經(jīng)過(guò)該作者同意,本人就引用一下:@zzyyppqqthanks2014年的時(shí)候,基本都是使用eclipse來(lái)開發(fā),使用androidmk來(lái)編譯ndk程序。但是目前都是使用AndroidStudio做為開發(fā)和編譯ndk的工具,因此我們關(guān)注AndroidStudio上的實(shí)現(xiàn)和編譯。zzyyppqq-超級(jí)簡(jiǎn)單的AndroidStudiojni實(shí)現(xiàn)(無(wú)需命令行)通過(guò)使用ndk提供的工具來(lái)編譯ndk程序。根據(jù)上述文檔,總結(jié)一下開發(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)
編寫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開發(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多頁(yè),太可怕了?。zyyppqq-AndroidStudio使用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)闆]注意這一點(diǎn),導(dǎo)致掉在坑里兩天沒出來(lái)。太痛苦了(見下圖說(shuō)明)。
3)
一定要按照上文提到的步驟,一步步設(shè)置,zzyyppqq的gradle設(shè)置流程很清楚,就當(dāng)武功口訣來(lái)使用,否則掉在坑里你也不知道怎么回事。
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í)編程語(yǔ)言進(jìn)行嵌入聯(lián)接。1)很簡(jiǎn)單,官網(wǎng)下載,解壓到**最好沒有中文字符的**文件夾下
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)
編寫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é)果傳出來(lái),對(duì)于java來(lái)說(shuō),必須要裝箱(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等代碼,借助于一些工具,不到一分鐘就可以將源碼和資源全部反編譯出來(lái)。大家可以下載一下微信android或faceuandroid版,反編
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 公園沙坑施工方案
- 人教版中職語(yǔ)文基礎(chǔ)模塊下冊(cè) 16面朝大海春暖花開 教案
- 竹子支撐施工方案
- 云南2025年云南省糧食和物資儲(chǔ)備局所屬事業(yè)單位招聘3人筆試歷年參考題庫(kù)附帶答案詳解
- 消防生命安全課件
- 初中科學(xué)浙教版九年級(jí)上冊(cè)教案
- 臨滄云南臨滄市臨翔區(qū)商務(wù)局城鎮(zhèn)公益性崗位人員招聘筆試歷年參考題庫(kù)附帶答案詳解
- 二零二五二手房購(gòu)房意向定金合同書
- 砂場(chǎng)租賃合同書模板二零二五年
- 中山廣東中山市消防救援支隊(duì)南朗大隊(duì)招聘政府專職消防隊(duì)員5人筆試歷年參考題庫(kù)附帶答案詳解
- 圖形與坐標(biāo)復(fù)習(xí)(評(píng)學(xué)科帶頭人)
- 九年級(jí)上冊(cè)歷史知識(shí)點(diǎn)復(fù)習(xí)課件(部編版)
- 脫碳塔CO2脫氣塔設(shè)計(jì)計(jì)算
- 2022年四川省阿壩州中考物理真題及答案
- 香港匯豐銀行大廈結(jié)構(gòu)選型
- 房屋硬裝裝修合同范本
- 2023年?yáng)|莞市人民醫(yī)院醫(yī)師規(guī)范化培訓(xùn)招生(放射科)考試參考題庫(kù)含答案
- 2022年甘肅省張掖市輔警協(xié)警筆試筆試模擬考試(含答案)
- 勾頭作業(yè)施工方案
- 中醫(yī)醫(yī)院重癥醫(yī)學(xué)科建設(shè)與管理指南
- 創(chuàng)傷性網(wǎng)胃炎
評(píng)論
0/150
提交評(píng)論