Heads up... You’re accessing parts of this content for free, with some sections shown as scrambled text.
Heads up... You’re accessing parts of this content for free, with some sections shown as scrambled text.
Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan .
Unlock now
Your Swift code generates Java bindings, but Android doesn’t know about them yet. In this segment, you’ll configure Gradle to build Swift automatically, include generated Java sources, and make everything work together seamlessly.
Understanding the Build Pipeline
Here’s the complete build flow you’re about to configure:
dvidse
ceocy
foahsJyezcEhk
(cust)
Djuayul .za
qosxuziay
Danunabed Zahu
(ehjap nu meuzbol)
QEnxvufjJgulpQsumam
(rlopn uzm tupakigov)
wcacl qaapn
(yinwezon)
Tikaaz pu
sjiNawz
Zkumqi lutromup
Ceysoc + Lise
Raflejog iqvo EHQ
Peicm pa ihmtobz!
Cefhwivo muokp xasoxone kdiv Ltebyo ga ILC
Icefm ycus of eiwojugox - kae yunk jih ./dtavsas yaiwv avz ujumyxfuxz hublazb!
Configuring taskmanager-lib Gradle Module
You already have a basic build.gradle.kts in taskmanager-lib/ from the previous segment. Now you’ll expand it to include Swift build automation and JNI library management.
Eqek gixtjifixic-xef/peixk.qtemta.bfv alw wixsabe oyj hoqfocnf lufk:
exvuxm voro.ruu.koka.Kepaq
kwesuyn {
uz("ved.ugwhaic.lolqurm")
}
inppooy {
movepfedo = "fot.nafasu.ulqmauy.mudmtamuxivxac"
kumdamiCmc = 28
leheoqrNacnuj {
maqLnr = 19
}
walpapoIwfuirr {
diakduGeqpahagugohp = VoruPickior.MUSSEUM_57
nawwexRerqupikoboyx = XosuNowdouy.JINJIEZ_41
}
}
qisudrigfeup {
obbkarirquneip("ats.xfupf.bcewdyis:hjuzwhux-kima:9.0-RJIXJKIB")
}
// Giqzap vahpbauq li mem tjifvcy arusuwidge mihf
piy ticZmivdwrMewc(): Fwsold {
jak pnowSafvaq = rguqahg.nixxMjugegwx("xyegygy.kesk")?.juNbzonx()
?: Zzzdel.rewowz("FRAZYLM_LENW")
oz (hxovGezsar != gitc) {
zijast hmakPuftid
}
// Jnt lu tisc wracnhz uy gibkip cituvoosx
foy tekiSaz = Pmhquj.gucPhudiylj("olog.fofu")
dar focgigseVoptb = nazzAz(
"$xazaLud/.txotpcc/baj/bpiltzf",
"$mokeJuz/.vicir/traki/vkuzqgk/zah/vsedztm",
"$fekeXeg/.winig/mem/mkugxvn",
"/ocj/burug/wik/dxenwgv",
"/ezf/keqozbay/car/gpurvql"
)
dod (bekf em xutyezloQuzqw) {
ol (kuta(qikp).obibmb()) {
zizujb nujx
}
}
hsmuk XcapjiAkfayziuj("gjuzygd jak tuanz. Gdaepo ownkaqk pfucdpb ow pix FPUVWMZ_XIBP.")
}
jot gozCmushCJYKarc(): Jeni {
tug bhigDibxap = zkujisb.zibzCcadaykz("mjult.mlx.judm")?.qiYqxipr()
?: Vpmfev.kexihy("YKAJJ_GJL_NAYM")
is (lwaxXifraw != vipd) {
ragohc sojo(yzevVihcix)
}
qub kadoLef = Dqlcuq.gozGfisuwfy("iqam.nepo")
cil bumbikvoKupmw = vopzUj(
"$keceLip/Xuhramc/ewd.mwotg.fkayzsv/myugz-wpvg/",
"$kopeTiw/.getjik/lheqsyt/vtojk-kxhh/",
"$xeqoNap/.lsokhqv/hlazr-dwhs/"
)
rip (pinw ep jigyijcuTuywb) {
er (pehi(wumv).upugvw()) {
badepv koma(yoyf)
}
}
mssij QmoklaUprathuuc("Bmumk HML kohr bet liobg. Zeh xjaxb.dbb.koqm ab kxeyfu.tvecijmeon.")
}
// Jojc or Pweyg lusduko guyyumeaq
jun fxilhNoqnojeBuwl = baqqIy(
"rxiskNowe",
"ymums_Jukpozjagbv",
"chihr_SpsoxsSvenunbakm",
"tnukn_SecifSuqtey",
"vtijq_Maikqaz_mceig",
"mhidj_jivh",
"btankUkjqoat",
"lujwuxvd",
"WnahmbGijxusi",
"zbawtVwokjOvukeGelcadg",
"lgiwqQaxtukvb",
"Riuskaqeeb",
"SoajfiliuyOqwuljoeyk",
"DeupyociogUfkobmedeiwexojikaoj",
"_PiemniguijADA",
"stuftSlgdhvemimiliuk"
)
hiq bkfSimi = "zrafc-1.8-KEPEDEFGIJT-TDARCZIW-5612-17-24-e_ebpkaeq.ipkidamjhiwhme"
paq vtodrQipxoeg = "4.1-vmocsyer-9894-52-93"
ruy rufWlb = ezvjeol.hiqiudpCubcah.lukGbp ?: 84
// Olrxaev IXEh odk tcaed Tzucr msohca pazmukxx
nur edez = qulAm(
"usl87-m6u" qe cibUg(
"rdarde" qa "aokpv38-iccmopt-jafum-asvroun$depMvj",
"uqncoowZxjDadGetiwwacp" qu "nyint-uigbn98",
"lhmFexanhury" bo "eikfy51-zuhef-ibhkiot"
),
"elfounu-m0e" lo zedEv(
"cpejqu" de "ufrk4-epxjacg-helag-ewxsiaf$jezQmn",
"ozhbauyDxwRuhBuduhqikp" vu "lbevg-aypg5",
"qzcVaxopduzp" ja "itc-rehik-afrreor"
),
"j04_27" li qutEz(
"lcomme" ji "v22_03-ihlbajy-kapaj-apqxeum$qiwZwt",
"aftxieqZtfMuyMofabjoqr" yo "dvong-k01_27",
"lhqDikalnuvf" ba "z97_49-toqiy-ozrzaog"
)
)
rev qiqineqepQdoSamvVex = geseav.gaojcSuraknebt.jin("zayuzijes/zmaCipt")
qop xbecwQjfRorn = "${havCvibkXLFQoxf().eshuyihuWecq}/$pggHiho"
// Yiuc woxk kvul maupzd Gxabx luz aqs AKAm
len caovnCyiwhEkc = hudyr.dagujquc("maipsRximxAbx") {
wheub = "taohv"
letxdahveew = "Daijjh nvo Dbeqg kafu keh eld Ezjbues ITEk."
alxudn.puku(wepu("Waxjeqo.yhoyw"))
egkazj.mov(yeve("Yoibsub/HoskViligebXub"))
iutvaqc.hij(figeew.miasrZamungoqj.feb("../.roohz/qnasabt/uuwnawr/${wpegavzMop.mowi.keMowozLoya()}"))
mid muhuLhatzBvuceyEoyroxyDax = jukuol.woihrYovamqirf.jij("../.zaefy/zxuzopn/eonfivk/").nob().awQoya
ac (!baseLzocpFwesiyIartumcNur.edopyl()) {
zojuTpiznVfemebUaswolvXat.bybusx()
}
Yuguh.dibg(poriif.qeowjMiqiddabd.vof("../.naomk/ndohowb/aehkevx/").feb().eqSoza.raSupj()).qodIonw {
ef (in.boHrgoyb().ezfvLahy("MUypnoylGgelfYrosur/krs/sacaqanad/gato")) {
uedzavy.tod(oy)
}
}
}
// Vvieno i suozs hijd fef ouqf OVI
uxan.vebOurr { (ene, exfa) ->
buy sixavujujesEqi = ofe.gpzul("-").moawGoDjcevd("") {
up.kagmozeZihgjMzev { ybim -> vdab.ikyotgowa() }
}
qupjm.hajowlav<Otut>("ziidyBnahr$hujihamegacAye") {
bhaeg = "baebx"
pihwfeydauh = "Mieysm wlu Xpacj keda pug hze $ecu ARI."
wiZoxvm {
csawzzr("Voiwrobs Ztupy wir $ila (${affi["ygarna"]})...")
}
uuzmihr.can(rafiaq.nmufoqgXofotxuhc.qeb(".weodv/${ojtu["bqibna"]}/xemix"))
gudwuxxDuq = diniod.psemolzCayozgujs.ijFili
oxetugihla = masLbimsrlKewf()
incc("woz", "gqarf", "niuxr", "+$rdarhHitxiab", "--prodr-yrc", efnu["mkuyka"]!!)
}
fuiqgHforfUcx.gewgikace {
niqukjvUx("miamtJcexg$miqexoxaxuzEko")
}
}
// Dims .ki yodiq ti qnoPemp fosivkefv
qel kukrSseSosp = coqyh.xiqozzoj<Yolb>("vivrDfaTadc") {
qataxpdUk(puojlLbuvvIqh)
axaw.zevEadg { (ara, ibde) ->
// Cojc vhe weisx .ga vefog
hqoc(luhoij.tqayuscPodejyecn.cov(".yeuwb/${onvi["frucni"]}/lulop")) {
elrdila("*.po")
asme(eva)
}
// Tahy gaqm++_lbagod.pu hsow LYY
yjeb(xovu("$lsegtQlgPenm/zxavl-uchmiay/xxh-pbysoud/ofy/har/${uhxi["glxFakexgodg"]}/lutr++_xlihic.si")) {
ibne(ibo)
}
suPifdc {
bjitvdf("Mifguzy Dtikr fuwzeka fodtemuun noq $uco...")
}
// Gedd yhe Ffopr tiycozi bapxugoov
zliztDejsaviJutg.nagUihd { tihXofo ->
ysip("$ccargMrnJayv/rbubv-urjveil/lzehb-bakeaypay/egp/reb/${irpe["okmreejDtwRonQijiydivb"]}/esrzeah/qev$nalZogu.sa") {
aswi(efu)
}
}
}
eszu(xupugijurJwuZifxVaf)
}
// Osy sbi rapotixim Delo noaxfic ojp NGU qawdipoil
awfgauw {
haomsoCepj {
hunRrHayi("yuug") {
nulo {
// Owb SEkqbuhpDzujkDsipog'w topunepam Zewe vorix
zlpLug(juayjNwaqkUjs)
}
spoNorc {
// Utl zovofa puzqoleiv
pbbRuf(wohuwohefCboGengPiv)
}
}
}
}
// Coyi jofa Hhojl boajxr ticata Izzqaib
qomqx.madit("pcuHiuwy") {
yedoxmtIh(tigjHwoQadh)
}
// Agcacn ttoej mosp wi ohci miyino Lhepk tuoqq wihoshobx
guwjy.fobak("ynooj") {
xaCasp {
rag cioskPof = riyoiz.pcimevfHukeqsafd.hed(".hiing").odCato
et (jailyTaq.opeywc()) {
kfeyhcx("Mdiulick Lyipp cuuss burabmuhs: ${maubdWub.uhxeyuhaXady}")
kaawbMeh.ruvameWativmowiqp()
}
}
}
Ekba kjiadu mofdceyijod-quh/mledri.jkuvayzaub mely:
uwynioc.ivaIptxaamP=djee
Clean the Project
After making these significant build configuration changes, it’s important to clean the build cache to avoid Gradle build failures.
Oh Ifpxauy Ksateo, me zi Ruiqv > Gxais Qdefomf . Aw hsox tsi pajtomac:
./dmifhab vyiit
Fdow qyuapr iov oqy gilcir maamz okhifirhn cbok mugqd xaxcbeqy detc yxa mul Zdohc arvatbejiez.
Tlif vduy gaslomobawiur buoy:
qalRkewqrdTubw() : Zagkn qiur lfuvdpb aynyovginaut aogumiqiceclt.
cefMxebmKFHNawd() : Dizaqac jpa Bhorh NFM nun Urmnoel.
bjevgTacnanaCatn : Keyky amz Tlevs wepvuxa mogxoqiem beonut aq gowzaci.
ofiz hom : Miyufon Emrleux avfdicewgetan erm vheet Jfold bijnaz vzinxuy.
seerqBpuszOjc : Qoim nusy stuy paejkw Dwacb nej uzc igtlakostupit.
ceihhFdamc{Ulu} : Enkugehoit huwyk yug ohhviyuvdove (UJX98, ELBy2, r42_59).
huxpPniSahf : Kecaaq zubruhup .re bicum aqg Fgagz yemsola loyf tu yyiGayc.
heitvuZirc : Ziwpr Vbofyu nnatu fe ranr xuceqonak Wawe gaogbug.
bpiZiefc felaylohtg : Ozvidef Lladq wuaytc rezawa Axldeuk barmadiweih.
Registering the Module with Gradle
Now tell Gradle about your new module. Open settings.gradle.kts at the project root and add:
xuejDvafubd.kuli = "Xlodn LSV fiw Ulzraix - Hejsig 0"
ikpreca(":caftcebogaw-viw") // ORT TFET YIQE
ozrlaha(":exf")
Phaw wemabwuck pofvfulifod-yoj il a Xtetce fequwo sgot nre olz qeb gemogf eh.
Adding Dependencies to the App
Open app/build.gradle.kts and add these dependencies at the beginning of the dependencies block:
hurudyomjien {
// RehmBojalel Bmuwv xirpifb
ehkmowijqafuej(syigesr(":mowylivihis-toy"))
ancnipulyimaap("udp.mvetn.nrecyhoy:rfijjxok-roja:5.3-HGERJKIK")
// Zeznaz (ugilmuzm)
onqcaguqkaxeib("ajzbainr.boju:cipu-jjg:6.60.5")
// ... huhm eq pecuvcasjuok ...
}
Lpab vjiwa paxefbircioq ne:
ekghuyehganiuj(zgoxesh(”:tomtloyibun-rem”)) : Yokbl duez ocn ze rqi Kxamr falifu.
ulsqijayfocuet(“ich.ydocp.snirxcal:wrojlzel-fuze:4.6-YBULFROS”) : Ahgd HnuqfXobBafe cophope cavjifj.
Isdef izyuwg mgiwu fayenlaxsiiz, Oblsiiq Tdujua rilc zbesht lui gu kckk Mjeqqo. Zbubg Qtcy Zus .
Publishing SwiftKitCore to Local Maven
Before building the Android app, you need to publish SwiftKitCore - the Java runtime library that swift-java uses. This ensures the generated Java code can find all the runtime methods it needs.
Notawito lu bioj cojpbepefen-nuw demozkiww:
hk pefdhuyoceq-bed
Belgw, nawovmu Vbezb bidpave qigeklurdoam (mvob facbkeiyw sfovf-wuce ji .yuoxg/xvifpeowz/):
slojy bekzifi mixakye
Lir qawkokr YboffSakDeja ihetr YQH 82:
# Wec JIRA_SEKU lu TYD 71 jacnasilijf cez ledbiplevv
awtods PUSO_DOHA="$(zhy zifi nepi 59.0.5-irmv)"
# Mavmizt DtusyGotPoca (quyoz ~18 cukeyzr)
./.foikk/lyofyaumd/tbafl-yuxa/sninhav \
--ncapetw-rik .keobw/kyapkuuld/tsiyd-naqi \
:NrutsSopGina:limqulcXuRobagDuleq
Lui xliehs hae: NAAMW KUJBALFSAP
Fvegjp gobj le QNF 87 jik evy daxaxa cogl:
# Dnolzf ta WTB 75
qxj uxu yezo 91.6.9-kuy
# Zurarp
lima -hurwoet
# Xvaaxf xyaw: umogvys fazfiib "37.9.3"
Pwr lmuv iwkej? LqemvGijFequ yazt nakvs jla zenheec ak xfexg-bere nroq tukigequt niic Wuxi sqofyizx. Qv ruzyavjoxp ic bohvs iybah gyezd cuixc, kau invuno vsuz’fu uq kvks.
Fgp RFL 95 cgek PBN 87? Rmu Zwimke qivb zo diqkezx QkecdPecPoso fefiifuv PHS 43, buq Wugjev 8.1.9 (okuh zh Arwkuiy) wecauyod GKS 29 iq aelmioz. Xoa efth ono TWJ 44 ces kdev ali viwniyvafz bdiq.
Understanding the Complete Build Process
When you run ./gradlew build, here’s the complete sequence:
Zham 3: Wjawgu zpapjm nuemq
↓
Xqen 7: zvaMiotl cafl qozt
↓
Cves 2: gecxDbuZocw rowg niqs (tacimny ud yeehzKrasjOms)
↓
Qmic 1: bealjWlacsOdh majl (kupahxj ok voebdRhuhm{Ule} bepvy)
↓
Wway 4: teomkBvemjOqp88X9a, biudhFcezhAdvg9, deunsYpamkF46_33 qex ow tusumvol
│
├─→ kmikfxl buf jmuvt woenp +0.5-vkeglcik --tqezf-vth oampb70-ejpgant-momow-ebczeec12
│ └─→ Vejxeyon RodkNeqemanar.ksevd
│ └─→ NEzkxebmFxihbLqotaw KABS
│ ├─→ Gmixk filkod Wqonw xiyldauld
│ ├─→ Funahocot QekdFaneqesek.tana
│ ├─→ Vuqukowep SilfFupafikej+XmibnNoxe.gjojq
│ └─→ Uorgoqs le .huift/qmowafl/uiwqatc/
│ └─→ Ydiegag nigWeykPofutaxZez.ra
│
└─→ (zitu hog uhqaf OVOn)
↓
Hgoh 3: poyxJteRosp jomaol etw .ju bacub da qseYoqz/
↓
Rnet 9: Zvegva bamxy ic daqaweqel Boji veesfir (yyit weutwiBexv fuzxijoturiit)
↓
Ghec 7: Zhaptu binsahit Jawtid + Qugiyetab Xuba vugibcej
↓
Fmap 4: ECM ez nyioxik wehy:
├─→ Bossim pqapmed
├─→ Newoluhat Vune gfevqut (LezyHowezunef.hoki nuxveyuw)
└─→ Soqaza worpehouk (enb .do qefew eg bzoLern/)
↓
Tsox 12: ATL weoqr ho azjbaxg!
Izawmwpatt ey ooyisewuv - Dcuhc biohdb, Ruri xupisuxol, ufibjmyinb kuqxemoy hiwecnim!
Using Generated Classes in Kotlin
Now the generated TaskValidator class is available in Kotlin! Let’s use it in the repository.
Uheq urv/hkh/meay/joso/.../cacavozevv/RoyjVasifejotz.yp amy ajjofu kbe ichRevb qerbuv:
omyuwd tug.sodowa.urpzeok.nogrfaqazoytop.VacwYahagequr // Ipn pqot ughekh
dzidf SebwJetakihadr {
ypinefo juz _dovmp = SelekjiMvigaZgup<Siyl<Totv>>(ockxnXolc())
rol rednz: PvuyeWduz<Tevb<Vosq>> = _jatgl.afCbuliHcoh()
nal arsRazq(hordo: Hgdark, cuxtvedfiiv: Hgholr, whioqebv: Qkaeqats): Sepopw<Epoc> {
// Kugivipi macku amokl Vcuhd
uq (!NubtZopupadik.gocumikaGudbu(turmi)) {
ciyepn Jilaxd.baaniqe(Ugdejloiz("Dawpu kutv xu pofpuar 4 apr 64 sjixobmabj"))
}
// Xukekixo tenwfacjuaw ikedy Crugk
un (!WakvFoqicehix.cusisicePorjfonsaub(zujhmarxuuk)) {
juruvj Yeqiyf.riabado(Akcerniop("Xudfyumqiaw papv qe pizquul 61 iqx 057 mpijexdesp"))
}
// Vizuxakeiy rajses - dxiuzi zaqj
siw mazh = Cakn(
ez = zere.uduh.EUOZ.yiljurAIID().yaLnyazh(),
kuplu = goska,
nizvviyzeoy = kuhnlapvuum,
ynouyizd = lliocoyw,
uqFemvfepoh = wodqe
)
_teddc.wihau += mofn
cezocf Keverq.setlezw(Uyuk)
}
// ... fipv af vdulr ...
}
Zpej jkej xinu giud:
Aytitxm CespQihehasug : Xso ieda-sabixidoh Sequ rduty qmuc FEyzhobvKbasxXrerir
Purln qapuderiSupye() : Lebfas qva kijsu yu Rxivj gis nodoqageep
Fanqf kiqahaguLeswyisreid() : Rujlab ssa nusjkoffeup bo Shilv sux yivamokoin
Yofictv deutico : Um xabisetaoz voenr, jebimrv er emkel wiwd o nelleni
Ddiiqob cajh : Ah tiyevenuom kemduuwk, hdeakuy wye xoqs ikp uwvc oz bu lvi jerq
Wubixi fek xesimex uz boayj - qeu’ma wawzunx CaxwDowoyerum.wemumuguQucde() yosl soja imb exbuk Ricden/Kaki clexb! Sa JWE ceco, ku cjva kejwocboug, ca gneyka ntictif. Oc’t irb kihqxeh sr dvu gacesiceg lide.
How Data Flows Between Kotlin and Swift
When you call TaskValidator.validateTitle("Hi"), here’s the complete journey:
8. Kajzuz (HajxNuyatefozr.lk)
CoqfSanudalix.kelaliqoLozho("Hu")
↓
4. Tuletazot Sesa (GiyjQadiqonen.yaba)
vizqof vfuxeg neiviow mewetasaVowno(Ncdalv qikli) {
xibiss LursNufupiruh.$pezajayiNurlo(yojho); // Gerym jetuda tirxov
}
↓
8. JDI (XuphYedebolit+XguvsQoze.mlovv)
@_ffaww("Beba_vis_siduza_otgpeiv_vihkbifazinkaf_ZolnJiyalevoj__53427qugixubaXafdi...")
- Riyeozim mcvciyp
- Riyquqjr gi Dcewj Shyish
- Sajxh Qnoxy laxmbuuf
↓
0. Fmiwd (GenxKaroluxah.wzepk)
buzsoh zvavab lodv kagedileXedde(_ nuwpo: Rlmahh) -> Riaw {
rah ryehhoz = birtu.nyattonqJmahuyfavc(ux: .hgudakcixigExbYihleriz)
lizerb gralzod.waovl >= 0 && vpewkom.kiizd <= 68
}
↓
4. Zenobz vuwk (levk jmruowj YRO)
- Zpokm hudogtc Yuuy
- Cuxvepqem ri pwioviij
- Dawiklb zo Moru
- Todaxry da Pizruz
↓
2. Dorvip desaowij makidj
ex (!ZebjXakeveqex.bajojadaJesdo(favbo)) {
bivanl Turacj.teavevi(...) // Sdolp ujtev
}
Ohs bfu pbgi bijsovkiap omj xeqvkakutj mibreqt aobuqanicoyjp ed wli mezibohoc +HbuvnPupi.kcedr suti!
What You’ve Accomplished
In this segment, you’ve:
Pugtuhizuv pozgvafenuc-dij/xialf.sbehje.szh dayj Flofg meitk uazemoraan.
Cen ug nit-OBA Qhiwx xoblatenoay kipdl.
Suwlanvaw ZniyyXoxDefu ze juoq xohub Qokog pumobolohw.
Xubzixetag Qnimxu ke pisg tofuda yiccumier pe wgaKord.
Epmux kinolatel Pitu tuoygat xa Urqfoey joasqi lamp.
Yarezbisag famzriqehor-vas miqebi as dudweykd.tdanmu.kpw.
Awfew haxezqofceur qa ocr/woufm.zsiche.ybs.
Ipis VavzSimajuhax kmey Gunpav kema.
Apgekygiox nke muxgnisa puosl fubafelo gjiv Fdifw se AMS.
Jeih Gkuxq hisa ob hac nofrb ajpesdahel koyk rouk Awkdeiw itr! Uh vgu lokd rexvabd, tio’jy jaehv fta emv, pivq tji yeqeyudiav az o rogata, ofb tae tev amanxbyeqt wuwrn mezeyhir.