An example of building a clojure library for iOS with graalvm native-image.
GPL-2.0 License
An example of building a clojure library for iOS with graalvm native-image.
Built with membrane.
See examples/gol
Watch the project in action on the Apropos Clojure Podcast. Show Notes
download-deps
$ scripts/download-deps
Make sure GRAALVM_HOME
is set and is on your path before starting.
exportJAVA_HOME=<path-to-graalvm>/Contents/Home
export GRAALVM_HOME="$JAVA_HOME"
export PATH=$JAVA_HOME/bin:$PATH
$ ./scripts/compile-shared
This can take a while.
An example project that uses membrane for UI can be found under xcode/TestSkia/TestSkia.xcodeproj. It also starts a sci repl that can be used for interactive development. Simply connect to the repl and start hacking! To update the UI, just reset!
the main view atom. Example scripts below.
./scripts/compile-membrane
Hello World!
(require '[membrane.ui :as ui])
(require '[com.phronemophobic.grease.membrane :refer
[main-view]])
(def red [1 0 0])
(reset! main-view
(ui/translate 50 100
(ui/with-color red
(ui/label "Hello World!"
(ui/font nil 42)))))
Simple Counter
(require '[membrane.ui :as ui])
(require '[com.phronemophobic.grease.membrane :refer
[main-view]])
(def my-count (atom 0))
(defn counter-view []
(ui/translate 50 100
(ui/on
:mouse-down
(fn [pos]
(swap! my-count inc)
nil)
(ui/label (str "the count "
@my-count)
(ui/font nil 42)))))
(add-watch my-count ::update-view (fn [k ref old updated]
(reset! main-view (counter-view))))
(reset! my-count 0)
Basic Drawing
(require '[membrane.ui :as ui])
(require '[com.phronemophobic.grease.membrane :refer
[main-view]])
(def pixels (atom []))
(defn view []
(ui/on
:mouse-down
(fn [pos]
(swap! pixels conj pos))
[(ui/rectangle 600 800)
(into []
(map (fn [[x y]]
(ui/translate x y
(ui/with-color [0 0 1 1]
(ui/rectangle 10 10)))))
@pixels
)])
)
(add-watch pixels ::update-view (fn [k ref old updated]
(reset! main-view (view))))
(reset! pixels [])
Found in examples/
directory.
examples/ants - Classic ant sim examples/gol - Game of Life examples/objc - Objective-c interop t3tr0s-bare - Tetris snake - Snake
Questions? Comments? Connect with us on clojurians slack in #graalvm-mobile (join here).
The key ingredients for creating binaries for iOS using native-image are:
In addition to gluon, there have also been some other forks that have tried to make building the static jdk and native libs easier. See https://graalvm.slack.com/archives/CN9KSFB40/p1714544531823089 on the graalvm slack.
Copyright © 2024 Adrian
Distributed under the GPLv2 License. See LICENSE.