公司的企業(yè)文化怎么寫微信搜一搜seo
大家都知道Delphi能調(diào)用安卓SDK,比如jar、aar等,
但是反過來,能在Android Studio中調(diào)用Delphi開發(fā)的窗體嗎?
想想不太可能吧,
Delphi用的是Pascal,Android Studio用的是Java,這兩個怎么能混用呢?
而且用Delphi就能開發(fā)好APP,為啥還要用到Android Studio?
搞這個的人,得是有多閑!
就讓我這個閑得蛋疼的人來嘗試一下。
首先用Delphi建一個工程,
如下Delphi工程,
名為EmptyDelphi:
差不多是一個空的工程,就只有一個很簡單的窗體,上面放了按鈕,點擊彈出:
“Hello,我是Delphi窗體?!?? ?
將它在Android 64位平臺下Build一下,
會生成我們后面需要的文件,
它是Android64\Release目錄中的libEmptyDelphi.so,
so文件是安卓下的動態(tài)鏈接庫,
Delphi將工程的窗體和代碼都編譯到它里面了:?? ?
在手機(jī)上跑一下看看:?? ?
注意頂部狀態(tài)欄,是灰黑色的。
? ? ? ? ??
再用Android Studio來新建一個工程(簡單看看即可):?? ?
填入APP名稱、應(yīng)用包名等:
可以新建一個Activity來玩下原生開發(fā)(在安卓下的窗體叫Activity):?? ?
窗體名設(shè)置為MainActivity,
默認(rèn)勾上Generate a Layout File,表示新建一個窗體布局文件,就像Delphi中的窗體是一對.pas+.fmx文件,而安卓下窗體是一對.java+.xml文件,
如果勾上Launcher Activity,表示它是主窗體,程序一打開就顯示它,
如下圖所示:
?? ?
雙擊res\layout\activity_main.xml來在窗體上添加控件:
雙擊就能打開窗體設(shè)計器:?? ?
從左邊拖個按鈕進(jìn)去,這種可視化的方式和Delphi一樣:
如果建Activity的時候沒有勾上Launcher Activity,
那么需要編輯AndroidManifest.xml,
AndroidManifest.xml是安卓程序清單文件,里面登記著所有安卓窗體、服務(wù)等,
打開左邊manifests節(jié)點里面的AndroidManifest.xml進(jìn)行編輯:?? ?
在Activity節(jié)點里面加入如下XML節(jié)點,
表示它是一個主窗體,app一運行首先打開它,如下圖所示:?? ?
點擊下右上角的綠色小箭頭就能直接運行在手機(jī)上:
效果如下圖所示:?? ?
?? ?
? ? ? ? ??
? ? ? ? ??
接下來把Delphi開發(fā)的窗體集成進(jìn)來作為主窗體:
要想在安卓應(yīng)用中打開頁面,就需要在AndroidManifest.xml中注冊一個Activity,
那么我們Delphi開發(fā)的窗體有Activity嗎?
它叫什么呢?
我們可以打開Android64\Release\AndroidManifest.xml找到答案:
(或者工程目錄中的AndroidManifest.template.xml中)
?? ?
如上圖,Delphi開發(fā)的窗體Activity為com.embarcadero.firemonkey.FMXNativeActivity,它是固定的,只是其中meta-data節(jié)點中的value值會變,是需要一個動態(tài)庫文件名,為工程名稱。
那我們把這一段復(fù)制到Android Studio工程中的AndroidManifest.xml中去:
并把Android Studio工程中原來的MainActivity注釋掉:
但是可以看到我們Delphi的FMXNativeActivity粘到Android Studio中之后,
都標(biāo)紅了,應(yīng)該是出錯了,鼠標(biāo)移上去,? ??
提示“Class referenced in the manifest,com.embarcadero.firemonkey.FMXNativeActivity was not found in the project or the libraries”,
意思是在工程或庫中不存在這個FMXNativeActivity,
那它在哪里?
答案是fmx.jar。
Delphi開發(fā)的app需要使用fmx.jar來實現(xiàn)一些底層的安卓功能,
我們平??梢栽贒elphi 工程視圖中Android平臺下的Libraries節(jié)點中看到它:
fmx.jar它在Delphi的安裝目錄中:
C:\Program Files (x86)\Embarcadero\Studio\22.0\lib\android\release
fmx.dex.jar則是fmx.jar編譯之后的文件。
fmx.jar的源碼都在Delphi的源碼目錄中,
C:\Program Files (x86)\Embarcadero\Studio\22.0\source\rtl\androiddex\java\fmx?? ?
這個目錄一看就是一個Eclipse項目,
找到FMXNativeActivity這個類,它是Embarcadero用java寫的,?? ?
所以要想在Android Studio中使用Delphi的頁面,那么就需要引用fmx.jar。?? ?
? ? ? ? ??
在Android Studio中引用fmx.jar
將它拷到安卓工程app目錄中的libs目錄里面,
? ? ? ? ??
找到工程app模塊的安卓配置文件?build.gradle,它是安卓應(yīng)用的打包配置文件:
編輯它,在它的dependencies(依賴)中加入如下一行,
implementation fileTree(include: ['*.jar','*.aar'], dir: 'libs')
表示app需要引用libs目錄中的所有jar和aar:?? ?
改了build.gradle之后,右上角會有“Sync Now”,需要點擊:
你的APP如果用到了別的aar、jar也都放到libs目錄中來。
因為FMXNativeActivity在創(chuàng)建的時候會加載libEmptyDelphi.so這個文件,? ??
我們需要將它布署到library\lib\arm64-v8a目錄中,
先將libEmptyDelphi.so拷到安卓項目app\libs\arm64-v8a目錄中,
把這個so布署進(jìn)去,
編輯app模塊中的build.gradle,在android節(jié)點中加入:
????sourceSets?{
????????main?{
????????????jniLibs.srcDirs?= ['libs']
????????}
}
如下圖所示:
? ? ? ? ???? ?
好了,在Android Studio中運行工程到手機(jī):?? ?
?? ?
看看頂部狀態(tài)欄,它是藍(lán)色的。
現(xiàn)在我們成功的用Android Studio將Delphi窗體打包進(jìn)去了,
其實就類似在Windows平臺將Delphi窗體封裝進(jìn)DLL,然后給C#調(diào)用來顯示它們。
這么做有什么好處呢?
1.集成aar方便穩(wěn)定,特別是遇到實在解決不了的閃退卡死等情況
如果Delphi APP引用了太多的aar,我們不僅需要自己處理依賴包的下載、資源的合并,編譯R.jar,除此之外經(jīng)常會遇到閃退卡死等問題,非常難排查,
用Android Studio就不會有這種問題的產(chǎn)生,直接在build.gradle中編輯好:
Gradle插件直接幫你自動完成全部工作。
? ? ? ? ??
2.打包安卓應(yīng)用快
當(dāng)你的Delphi APP引用了太多了aar之后,要布署相當(dāng)多的資源文件,用Delphi打包APK的過程就會顯示相當(dāng)?shù)穆L,我有一個項目打包一次在五分鐘左右,
而用Android Studio打包,則一分鐘都不到。?? ?
? ? ? ? ??
3.與安卓原生協(xié)同開發(fā)
你可以將你的工程編譯為安卓鏈接庫給原生java他們調(diào)用。
? ? ? ? ??
當(dāng)然Delphi也可以使用Gradle插件來自動集成aar,后面有時間整理好分享給大家。
? ? ? ? ??