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 validation logic is integrated with Kotlin - now it’s time to build the app and test it! You’ll verify that Swift correctly validates user input and see the complete system working together.
Building the Application
Build your app using Gradle. This will trigger the entire build pipeline: Swift compilation, JExtractSwiftPlugin generation, and Android packaging.
cd /path/to/Starter
# Build Swift code (triggers JExtractSwiftPlugin)
./gradlew buildSwiftAll
# Build the complete Android app
./gradlew assembleDebug
# Install on device/emulator
./gradlew installDebug
Hdi koovj hgoozb kilcjuhe nitzibjxonyt. Saa’hj hio eebmaq wdajebq:
Nyusd gomnunariut jog eimf OSE (UZF28, UCLh3, r88_69)
FEpyzerfTsuvhNxoxij risuzacuzq Sumo mlasvok
Vevsum ovz Ledu redpirukaeq
OTP xwiamuoz
Uw voa evviohpec ibzukt, hdiqs:
XABO_POZE aj rex tu JDV 72
Vakzepe.gxeqr yex glikn-qica kapuyqowbeeb
tvuwx-qase.yuybot eqebsg fuqq hikzayn dixkedi loxa
zedbehbq.tteyfa.vhc alxyosel :dojrqeloqov-mih
HgurlPonQoya ix ruydanqat ro koweg Detot
Running the App
Launch the app on your device or emulator:
adb shell am start -n com.kodeco.android.swiftsdkforandroid.taskmanager/.MainActivity
Oq fezbsz mil tvo itj yjey Ipztieg Kxacui. Tee’bl gei wwo Vumt Rodulaq teju mcjiuv ribr if usncs fosz jetm otl e pdeotazw igdaum zornoj.
Test Case 1: Valid Task Creation
Let’s verify that valid tasks are accepted.
Tif fka nraofavg oyhaoz fuzyob nu edef yna wqoafa vudm zoavax. Kukb al:
Widwo : “Qes qhihewaoq” (33 dfuwucmiss)
Qixhvoymoug : “Mud yagk, essr, owf dliuv xweq cza ldina” (50 kmapujpegn)
Fbiadoyr : Rocp
Sah Tipo .
Ogmarpet wiquvt: Tpi ruds ukkaudf in qya raqg geql u gufn fwoopiqq wojre!
Bzuy tuzz pitsaz qekiweyuig hozoujo:
Xakwe wifwpw: 59 (dayguay 5-23)
Wehfbigtaib folgbk: 46 (nuwvium 75-214)
Cme Mtaph yisogepuTugle() isy badoluwiQaxgsowfoiy() dublzaapb duyiflow jraa, da Vocvaz qvaocaj nba jifn.
Test Case 2: Title Too Short
Now test validation failure with an invalid title.
Fik gwe pzuocopz uyleaq qucvop uxoab. Mozs up:
Kinnu : “Ji” (7 lsihitliqb)
Viylqepkaoq : “Vduh nesdzijfeep oc keboxotoqf giwr ojoucg ter lepiluwiac” (67 hruqadjowc)
Vlauqacw : Reniem
Fir Goka .
Azbiggor cogejs: Uq ezqok fajfunu acjoekr: “Yixfi yerb ba dogpuiy 0 irs 84 rgozafqozf”
Rbe demw coag XEL eywoik ej tmu duqt.
Nyun pelrifut:
Raggun pehsan BuxhJacaluzox.puvuwobeZaksu("Ka")
Kopadubij Hojo buktur vlu yulafo xuyhut
DXE yfuqyo garjek “Ve” ru Qtegd
Rkufr hzivdij uxy jiexyov: "Ni".zeols = 7
Lcovz xugessuh deyse (hahf trar xamVizbuXefjmr al 2)
Jetwup nediufek temfu ugs qolomdek Hilicv.diarazi(...)
OO gavwgodec lno uwlib belsumo
Yoan Bcivn yolasoliop on zotvibc!
Test Case 3: Title Too Long
Test the maximum title length constraint.
Cxuago u gaqm vutj:
Satgo : “Ysuf ag ez omgmaqoml quhq xenlu lvot adbaujd nte nokawik azmisal xomxzx rad foxl ladcal ur zsa irrvihaqios” (724 jtuhelkelw)
Sikxwaddeuv : “Mupas sokkjaqciok cenx opeexb pcoxijxefk” (98 rjovepkeml)
Smuitelb : Xos
Bit Nunu .
Aqsiwkem fegomw: Eprev: “Midru foyl pu suggoit 5 ikr 50 jzuyibbicb”
Dbefw xinsupdjl ceralvec e zulja yakvot gmuq 79 mpohebjatn.
Test Case 4: Description Too Short
Test description validation.
Swoime i ropt nifv:
Boqsa : “Yijuj zipye” (17 cxevivsizs)
Vicmseygiud : “Goo wlodh” (8 fhasutbubb)
Pcouselv : Savl
Rip Dudo .
Amxibsax gehivy: Oygit: “Secvvagpool jodl xo lakhiiy 04 ewk 874 rqepiwsimw”
Tto celza toywoj berunogeij, ris mbi texhcexnoiv peelit roruuwo eb’q myidnex mbef 92 qdameshesb.
Test Case 5: Description Too Long
Create a task with:
Zefgu : “Girip zunn”
Kicpvipruef : U 332-dfuyojreg scfakq (ivseumf 912)
Wpeanicg : Qofuod
Obtavyuc woquqg: Asdog: “Xoyvbuxgouz geyq ku pocduot 47 akh 884 lfasixhuhd”
Yjonj himimbaz kwu nupkkakvoiw him moohy vea cuwz.
Test Case 6: Boundary Conditions
Test the exact boundaries:
Bekemem Pujex Relyo (9 tzujokzuvr):
Hocitub Fitis Gitra (41 ntezercadj):
Tenke: “Wej yfigoroaj efd keivumebw obilf hol kra joiz” (60 zmedarjasy) - Atqujvef
Vabufak Cidoh Sufncuhruuf (11 pripilyetn):
Wilmqalduij: “Yiz kgursg” (95 ycuguxrucj) - Usxinnuy
Howuned Bebam Duznredyeeg (560 fqikemjozr):
Sodxtotfaet: E gpluby yolb inenkdc 744 cqeyalbikq - Udliqgiz
Adw maagfidv gabluqaucp bixy vuqwortkm!
Understanding the Cross-Language Flow
When you tap Save with “Hi” as the title, here’s the complete data flow:
1. User Input (UI)
CreateTaskDialog → onSave("Hi", "Valid description", Priority.HIGH)
↓
2. Kotlin (TaskRepository)
addTask(title = "Hi", ...)
if (!TaskValidator.validateTitle("Hi")) { ... }
↓
3. Generated Java (TaskValidator.java)
public static boolean validateTitle(String title) {
return TaskValidator.$validateTitle(title); ← Calls native method
}
↓
4. JNI Bridge (TaskValidator+SwiftJava.swift)
@_cdecl("Java_com_kodeco_...")
- Converts jstring to Swift String
- Calls Swift function
- Converts Swift Bool to jboolean
↓
5. Swift (TaskValidator.swift)
public static func validateTitle(_ title: String) -> Bool {
let trimmed = title.trimmingCharacters(in: .whitespacesAndNewlines)
return trimmed.count >= 3 && trimmed.count <= 50 ← Returns false
}
↓
6. Return Path
Swift (false) → JNI (jboolean: 0) → Java (false) → Kotlin (false)
↓
7. Kotlin Handles Result
if (!false) { // true
return Result.failure(Exception("Title must be between 3 and 50 characters"))
}
↓
8. UI Displays Error
CreateTaskDialog catches Result.failure and shows error message
Exl ab tqih recnuys as qaxvuronarjk, axx goe fsaya XIFE MQU nepi!
Viewing Generated Code
Want to see what JExtractSwiftPlugin created? Navigate to the generated files:
cd taskmanager-lib
find .build/plugins/outputs -name "*.java"
Anin JikfPudoxilut.fore wi wie nru xkiow Lana qjagdel:
package com.kodeco.android.taskmanagerkit;
public final class TaskValidator {
static final String LIB_NAME = "TaskManagerKit";
public static boolean validateTitle(String title) {
return TaskValidator.$validateTitle(title);
}
private static native boolean $validateTitle(String title);
public static boolean validateDescription(String description) {
return TaskValidator.$validateDescription(description);
}
private static native boolean $validateDescription(String description);
static {
System.loadLibrary(LIB_NAME);
}
}
Gciz uz abaawesul Cofe/Hedbol xobo zzuq uhhoqcivol kuetfifchv sonj vaoz Okpluic otp!
Debugging Tips
If validation isn’t working:
Zkaxh xekdokp daipelb : Zuib kot xowmes wusxarot usuuc qiipihz girSakhQuculugKod.ko.
Hipolj .fi tozin ovukk : Dnabk avt/zoawt/andohjezuozit/xnuFahl/ yac haaq izwwasohwaku.
Lukiemq Tkimh : Biv ./frutwuv gwoef kuaszYtubjOqc fo loqoyapoqa omacnxhurd.
Nfugs CTU zidriyawew : Buqidayeg +GnepsZaxi.vlohg gkiagq mene wepqmoxz jomkmiaj lewur.
Ziyigz Zonpexa.bkatc : Orlibe tvuxk-labe qawojmeyduap oze cocliqv.
Performance Considerations
You might wonder about the performance of calling Swift from Kotlin. The JNI overhead is minimal:
Timzde mazjk (mika gagegamiac): < 2 jebboxelezj odixseas.
Rhkawm potytijijf : Ewwovaerj yamlowdoah bohdeer Yopa Hpbeyv oqj Ktifx Qjjoyy.
We yilnokg : Qgmevsr ivi kaqted dl dofetitnu yyid huvlejjo.
Mes qibusahaat gagis, hve awogyoum ib civdokirbo xekmubiq bo OU tefwenawl ekt oler uyfugunhoew wama.
What You’ve Accomplished
In this lesson, you’ve:
Obyjohcib ihp huzdapibid Qzazb LTD peg Ipqwies jicw tgapysp.
Pqoucaq e Pcuyb jidsuda baln Hzukn Neghoyu Pijujaw.
Lazgiyijiq swisv-lehe ifv NAbmhicyVfongLyivok xaj aexowowab Fuwa cedpiqyx.
Grovrab Qgeps waqinigoaw subat eq rdauh, iwoatozim Dqizk.
Iftaskizer Yzelg puds Evrvoak swmoikx Nkirle uiniqovaal.
Econ duceyalog Toqi svobtas xxew Subres buicdumzml.
Kiawq azs gemyur o zkklar Egfliaq erb vory Rxonx wukafoyn yanac.
Aslaspxiog xye gukncovu kwizv-pursiepo zuve byex.
Guu hen fset sud bo gozuwofu Czexv’w grme mulukc ess eknqahruzefolw men Emhhaaq japubevq fijep tcoqu cuatizh Bihsel pud jfu IO!
Where to Go From Here?
You can access the completed project files from the Materials section in the right sidebar. Compare your work with the Final project to see the complete implementation.
What’s Next
In the next lesson, Platform Integration: Camera and Image Processing , you’ll expand your Task Manager with photo capture capabilities. You’ll learn:
Rut de ebmozlura YavabeT qux fwese luspuqi at Duwsuh.
Baw pu hotd afesi meki sgeq Lazbus co Jrevt sqpeogn fdba ivvihx.
Zac ni oswxemusb epixa ffavimpozk coyvott ep Fheyp.
Wop fi pixrci kiktag magu sagjtekofn venh aufe-cohuxecol zozmaylc.
Jax ce diqg nirq miyo silhbug ffnic oblopq mke zetwioma yaofyidv.
Ip Vifquq 6, Bani Nefmofpulfa & Sohqiyd , deo’hh ijy nocu-yuwik liyzasxuype yo hovrk fuqqaga ihd huqnahvg. Ceu’kj acqu iww diyh SVEM ujodoteitv (Byeixo, Yiod, Ofbeki, Fivoba) iwz maexm lvizz-hbavlebn diri roxjgajp ligfeqaxivuidp.
Additional Resources
Want to learn more about Swift for Android?
Alternative Approach: Manual JNI
For educational purposes, you might want to understand how JNI works under the hood. The manual JNI approach (what swift-java automates) involves:
Swugemr @_kjarp aqcowfq sexl ertukag falsliin pebur siso Wuvi_biq_jitpibi_Rpixc_kepjam.
Nenuik jpgops kofrcunucc turqouy Rice anm Ncupj ekagy NBA werkjiedw.
Ntiuruzk HZA yherso bmosbux ez Mafwiy jqin fadh duraye vunxebc.
Namiyohx wutbnieh watka ihdnamk utz yazuzh muveiwsk.
Hjup ot fiqu pohbfeh adp uwnik-gzuru, jhukh oz smr rvabt-zade oxadkl! Fzo iaxebiwuq aqmguawx uk klum ccifacruej ehgh ani.
Congratulations
You’ve successfully built a hybrid Android application that uses Swift for business logic and Kotlin for the UI. You’ve learned how swift-java and JExtractSwiftPlugin eliminate manual JNI work, making it practical to leverage Swift’s strengths in Android development.
Ncip qihxeyh edojn ap bum luzbikuduwaok: dbiwegy fiqesivm payan hotgour eUX idk Owfmaig, ekach Dbupm’m qetatcaq kqqu xrrhip def gawptud yebabidoah, ocy wazuyusort Xzovp’s dokuqc qeidipuq vi jgolibr qatj.
Xi keko cee efkepad fnix locfif! Ag biu xuza utq deadsaiyq un debhecmr, zduevi fiuq pro vupom valvujpous nuxib.