android build

main
Ziyang Hu 2 years ago
parent 8bd44aca33
commit 909823b10d

@ -12,6 +12,7 @@ description = "Java bindings for CozoDB"
crate-type = ["cdylib"] crate-type = ["cdylib"]
[features] [features]
storage-rocksdb = ["cozo/storage-rocksdb"]
jemalloc = ["cozo/jemalloc"] jemalloc = ["cozo/jemalloc"]
io-uring = ["cozo/io-uring"] io-uring = ["cozo/io-uring"]
@ -19,5 +20,6 @@ io-uring = ["cozo/io-uring"]
[dependencies] [dependencies]
robusta_jni = "0.2.0" robusta_jni = "0.2.0"
cozo = { version = "0.1.3", path = "../cozo-core" } # , features = ["compact"]
cozo = { version = "0.1.3", path = "../cozo-core", default_features = false }
lazy_static = "1.4.0" lazy_static = "1.4.0"

@ -0,0 +1,10 @@
#!/usr/bin/env bash
export ANDROID_HOME=/Users/$USER/Library/Android/sdk
export NDK_HOME=/Users/$USER/Library/Android/sdk/ndk/23.1.7779620/
export PATH=$PATH:$HOME/Library/Android/sdk/ndk/23.1.7779620/toolchains/llvm/prebuilt/darwin-x86_64/bin/
export CC=aarch64-linux-android23-clang
export CXX=aarch64-linux-android23-clang++
export LD=$HOME/Library/Android/sdk/ndk/23.1.7779620/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld
export LD_LIBRARY_PATH=/Users/zh217/Library/Android/sdk/ndk/23.1.7779620/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/26
cargo build --release -p cozo_c --target=aarch64-linux-android

@ -11,23 +11,32 @@ use std::sync::Mutex;
use lazy_static::lazy_static; use lazy_static::lazy_static;
use robusta_jni::bridge; use robusta_jni::bridge;
use robusta_jni::jni::errors::Error as JniError;
use robusta_jni::jni::errors::Result as JniResult;
use cozo::Db; use cozo::*;
use cozo::RocksDbStorage;
#[derive(Default)] #[derive(Default)]
struct Handles<S> { struct Handles {
current: AtomicI32, current: AtomicI32,
dbs: Mutex<BTreeMap<i32, Db<S>>>, dbs: Mutex<BTreeMap<i32, DbInstance>>,
} }
lazy_static! { lazy_static! {
static ref HANDLES: Handles<RocksDbStorage> = Handles { static ref HANDLES: Handles = Handles {
current: Default::default(), current: Default::default(),
dbs: Mutex::new(Default::default()) dbs: Mutex::new(Default::default())
}; };
} }
fn get_db(id: i32) -> JniResult<DbInstance> {
let db_ref = {
let dbs = HANDLES.dbs.lock().unwrap();
dbs.get(&id).cloned()
};
db_ref.ok_or_else(|| JniError::from("database already closed"))
}
#[bridge] #[bridge]
mod jni { mod jni {
use std::sync::atomic::Ordering; use std::sync::atomic::Ordering;
@ -37,9 +46,9 @@ mod jni {
use robusta_jni::jni::errors::Result as JniResult; use robusta_jni::jni::errors::Result as JniResult;
use robusta_jni::jni::objects::AutoLocal; use robusta_jni::jni::objects::AutoLocal;
use cozo::{new_cozo_rocksdb}; use cozo::*;
use crate::HANDLES; use crate::{get_db, HANDLES};
#[derive(Signature, TryIntoJavaValue, IntoJavaValue, TryFromJavaValue)] #[derive(Signature, TryIntoJavaValue, IntoJavaValue, TryFromJavaValue)]
#[package(org.cozodb)] #[package(org.cozodb)]
@ -49,8 +58,8 @@ mod jni {
} }
impl<'env: 'borrow, 'borrow> CozoDb<'env, 'borrow> { impl<'env: 'borrow, 'borrow> CozoDb<'env, 'borrow> {
pub extern "jni" fn openDb(path: String) -> JniResult<i32> { pub extern "jni" fn openDb(kind: String, path: String) -> JniResult<i32> {
match new_cozo_rocksdb(path) { match DbInstance::new(&kind, &path, Default::default()) {
Ok(db) => { Ok(db) => {
let id = HANDLES.current.fetch_add(1, Ordering::AcqRel); let id = HANDLES.current.fetch_add(1, Ordering::AcqRel);
let mut dbs = HANDLES.dbs.lock().unwrap(); let mut dbs = HANDLES.dbs.lock().unwrap();
@ -72,15 +81,24 @@ mod jni {
script: String, script: String,
params_str: String, params_str: String,
) -> JniResult<String> { ) -> JniResult<String> {
let db = { let db = get_db(id)?;
let db_ref = {
let dbs = HANDLES.dbs.lock().unwrap();
dbs.get(&id).cloned()
};
let db = db_ref.ok_or_else(|| JniError::from("database already closed"))?;
db
};
Ok(db.run_script_str(&script, &params_str)) Ok(db.run_script_str(&script, &params_str))
} }
pub extern "jni" fn exportRelations(id: i32, relations_str: String) -> JniResult<String> {
let db = get_db(id)?;
Ok(db.export_relations_str(&relations_str))
}
pub extern "jni" fn importRelation(id: i32, data: String) -> JniResult<String> {
let db = get_db(id)?;
Ok(db.import_relation_str(&data))
}
pub extern "jni" fn backup(id: i32, out_file: String) -> JniResult<String> {
let db = get_db(id)?;
Ok(db.backup_db_str(&out_file))
}
pub extern "jni" fn restore(id: i32, in_file: String) -> JniResult<String> {
let db = get_db(id)?;
Ok(db.restore_backup_str(&in_file))
}
} }
} }

@ -10,6 +10,8 @@ crate-type = ["staticlib"]
[features] [features]
storage-rocksdb = ["cozo/storage-rocksdb"] storage-rocksdb = ["cozo/storage-rocksdb"]
jemalloc = ["cozo/jemalloc"]
io-uring = ["cozo/io-uring"]
[build-dependencies] [build-dependencies]
swift-bridge-build = "0.1.41" swift-bridge-build = "0.1.41"

Loading…
Cancel
Save