mirror of
https://github.com/element-hq/element-android
synced 2024-12-19 15:58:27 +03:00
rust: Add a README explaining how to build the bindings
This commit is contained in:
parent
c828326755
commit
c8c7f23298
1 changed files with 96 additions and 0 deletions
96
rust-sdk/README.md
Normal file
96
rust-sdk/README.md
Normal file
|
@ -0,0 +1,96 @@
|
|||
# Kotlin bindings for the Rust SDK crypto layer.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
### Rust
|
||||
|
||||
To build the bindings [Rust] will be needed it can be either installed using an
|
||||
OS specific package manager or directly with the provided [installer](https://rustup.rs/).
|
||||
|
||||
|
||||
### Android NDK
|
||||
|
||||
The Android NDK will be required as well, it can be installed either through
|
||||
Android Studio or directly using an [installer](https://developer.android.com/ndk/downloads).
|
||||
|
||||
### Uniffi
|
||||
|
||||
The bindings are using [uniffi] to generate the C translation layer between Rust
|
||||
and Kotlin. Uniffi is a Rust project and can be installed with our freshly
|
||||
installed Rust setup using:
|
||||
|
||||
```
|
||||
$ cargo install uniffi_bindgen
|
||||
```
|
||||
|
||||
### Configuring Rust for cross compilation
|
||||
|
||||
First we'll need to install the Rust target for our desired Android architecture,
|
||||
for example:
|
||||
|
||||
```
|
||||
# rustup target add aarch64-linux-android
|
||||
```
|
||||
|
||||
This will add support to cross-compile for the aarch64-linux-android target,
|
||||
Rust supports many different [targets], you'll have to make sure to pick the
|
||||
right one for your device or emulator.
|
||||
|
||||
After this is done, we'll have to configure [Cargo] to use the correct linker
|
||||
for our target. Cargo is configured using a TOML file that will be found in
|
||||
`%USERPROFILE%\.cargo\config.toml` on Windows or `$HOME/.cargo/config` on Unix
|
||||
platforms. More details and configuration options for Cargo can be found in the
|
||||
official docs over [here](https://doc.rust-lang.org/cargo/reference/config.html).
|
||||
|
||||
```
|
||||
[target.aarch64-linux-android]
|
||||
ar = "NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/ar"
|
||||
linker = "NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android30-clang"
|
||||
```
|
||||
|
||||
## Building
|
||||
|
||||
A `Makefile` is provided that builds and installs the dynamic library into the
|
||||
appropriate target specific `jniLibs` directory. But before we can get started
|
||||
we'll need to tweak our Rust setup to allow cross compilation.
|
||||
|
||||
To enable cross compilation fro `olm-sys` which builds our libolm C library
|
||||
we'll need to set the `ANDROID_NDK` environment variable to the location of our
|
||||
Android NDK installation.
|
||||
|
||||
```
|
||||
$ export ANDROID_NDK=$HOME/Android/Sdk/ndk/22.0.7026061/
|
||||
```
|
||||
|
||||
### Makefile build
|
||||
|
||||
After the prerequisites have been installed and the environment variable has
|
||||
been set a build for the `aarch64` target can be build using:
|
||||
|
||||
```
|
||||
make aarch64
|
||||
```
|
||||
|
||||
### Manual build
|
||||
|
||||
If the `Makefile` doesn't work on your system, the bindings can built for the `aarch64`
|
||||
target with:
|
||||
|
||||
```
|
||||
$ cargo build --target aarch64-linux-android
|
||||
```
|
||||
|
||||
After that, a dynamic library can be found in the `target/aarch64-linux-android/debug` directory.
|
||||
The library will be called `libmatrix_crypto.so` and needs to be renamed and
|
||||
copied into the `jniLibs` directory:
|
||||
|
||||
```
|
||||
$ cp target/aarch64-linux-android/debug/libmatrix_crypto.so \
|
||||
../matrix-sdk-android/src/main/jniLibs/aarch64/libuniffi_olm.so
|
||||
```
|
||||
|
||||
[Rust]: https://www.rust-lang.org/
|
||||
[installer]: https://rustup.rs/
|
||||
[targets]: https://doc.rust-lang.org/nightly/rustc/platform-support.html
|
||||
[Cargo]: https://doc.rust-lang.org/cargo/
|
||||
[uniffi]: https://github.com/mozilla/uniffi-rs/
|
Loading…
Reference in a new issue