Skip to content

pakoito/RustyAndroid

master
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Code

Latest commit

 

Git stats

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
 
 
app
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Rusty Android

Proof of Concept for interfacing Rust and Java-Android via JNA. Built on rustc 1.1.0-dev (aecf3d8b6 2015-05-01)

What works

Hacked jna library ready for gradle use. See https://github.com/pakoito/jna

C and Java interop via JNA

C and Rust interop via static linkage

Put it all together and you get RustyAndroid.

How to

Follow this guide through steps 1-4 to get your toolchain running

In case you're on an OSX, on step 3 your configure command is

../configure --host=x86_64-apple-darwin --target=arm-linux-androideabi --android-cross-path="$ANDROID_TOOLCHAIN"

In case you're on Windows-MinGW, on step 3 your configure command is

../configure --host=i686-pc-windows-gnu --target=arm-linux-androideabi --android-cross-path="$ANDROID_TOOLCHAIN"

Clone this repository

git clone https://github.com/pakoito/RustyAndroid/

Import into Android Studio

Setup your ndk.dir in local.properties

Create your .rs files with pub extern functions like the examples in the RustLib folder, and compile them using rustc

rustc --target=arm-linux-androideabi -C linker=$ANDROID_TOOLCHAIN/bin/arm-linux-androideabi-gcc -C link-args=-pie -C ar=$ANDROID_TOOLCHAIN/bin/arm-linux-androideabi-ar --crate-type=staticlib src/lib.rs

Cargo was giving me hell for Android on OSX, go the rustc route for now

Rename your .a output and copy it to /app/src/main/jni

Create your C glue layer bringing Rust through extern functions as in /app/src/main/jni/thing.c

See build.gradle, Android.mk and Application.mk for how it all is tied together on Android

For JNA integration, see ThingLibrary.java and MainActivity.java

Known Issues

Plenty of them. This shouldn't even work but it does.

There is a requirement for the unwind library found by @skligys to solve some missing dependencies.

For now it builds only armeabi libraries. You can reuse them for armeabi-v7a too just by copying libHelloRust.so from /app/src/main/jniLibs/armeabi to /app/src/main/jniLibs/armeabi-v7a.

It can be built on Linux and OSX effortlesly. I can be built on Windows using an updated MinGW, but only if you have LLVM/Clang versions from June '15 onwards. It may require to have Visual Studio installed (?) Building rust static libraries only works on linux and OSX. Windows doesn't have first class LLVM/Clang support.

Jnaenerator

You can autogenerate your java glue files using Jnaenerator with a variation of

java -jar jnaerator-shaded.jar -library thing thing.c -o . -v -noJar -noComp -runtime JNA

License

See LICENSE.md

References (in no special order)

http://blog.rust-lang.org/2015/04/24/Rust-Once-Run-Everywhere.html

http://users.rust-lang.org/t/rust-nightly-for-android/645/3

https://github.com/rust-lang/rust-wiki-backup/blob/master/Doc-building-for-android.md

rust-lang/rust#17437

http://harkablog.com/calling-rust-from-c-and-python.html

http://stackoverflow.com/questions/28161628/linking-shared-object-library-without-headers-with-ndk-in-android-studio

https://ubuntuincident.wordpress.com/2014/12/24/getting-started-with-the-rust-programming-language/

http://www.sureshjoshi.com/mobile/android-ndk-in-android-studio-with-swig/

http://sdgsystems.com/blog/using-android-ndk-android-studio/

http://www.eshayne.com/jnaex/example01.html

https://code.google.com/p/jnaerator/wiki/JNAeratorFAQ

rust-lang/rust#25032 (comment)

http://stackoverflow.com/questions/15241869/pthread-error-in-ndk-build

https://github.com/skligys/rusty-cardboard/tree/fc999e0385de7ab5d32a319ca523225a7e0d673f/jni

http://sourceforge.net/p/mingw/bugs/2043/

Screenshot

First run

About

Interoping Android's Java with Rust via JNA

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published