1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
#![allow(missing_docs)] use thiserror::Error; use crate::sys; use crate::wrapper::signature::TypeSignature; pub type Result<T> = std::result::Result<T, Error>; #[derive(Debug, Error)] pub enum Error { #[error("Invalid JValue type cast: {0}. Actual type: {1}")] WrongJValueType(&'static str, &'static str), #[error("Invalid constructor return type (must be void)")] InvalidCtorReturn, #[error("Invalid number of arguments passed to java method: {0}")] InvalidArgList(TypeSignature), #[error("Method not found: {name} {sig}")] MethodNotFound { name: String, sig: String }, #[error("Field not found: {name} {sig}")] FieldNotFound { name: String, sig: String }, #[error("Java exception was thrown")] JavaException, #[error("JNIEnv null method pointer for {0}")] JNIEnvMethodNotFound(&'static str), #[error("Null pointer in {0}")] NullPtr(&'static str), #[error("Null pointer deref in {0}")] NullDeref(&'static str), #[error("Mutex already locked")] TryLock, #[error("JavaVM null method pointer for {0}")] JavaVMMethodNotFound(&'static str), #[error("Field already set: {0}")] FieldAlreadySet(String), #[error("Throw failed with error code {0}")] ThrowFailed(i32), #[error("Parse failed for input: {1}")] ParseFailed(#[source] combine::error::StringStreamError, String), #[error("JNI call failed")] JniCall(#[source] JniError), } #[derive(Debug, Error)] pub enum JniError { #[error("Unknown error")] Unknown, #[error("Current thread is not attached to the Java VM")] ThreadDetached, #[error("JNI version error")] WrongVersion, #[error("Not enough memory")] NoMemory, #[error("VM already created")] AlreadyCreated, #[error("Invalid arguments")] InvalidArguments, #[error("Error code {0}")] Other(sys::jint), } impl<T> From<::std::sync::TryLockError<T>> for Error { fn from(_: ::std::sync::TryLockError<T>) -> Self { Error::TryLock } } pub fn jni_error_code_to_result(code: sys::jint) -> Result<()> { match code { sys::JNI_OK => Ok(()), sys::JNI_ERR => Err(JniError::Unknown), sys::JNI_EDETACHED => Err(JniError::ThreadDetached), sys::JNI_EVERSION => Err(JniError::WrongVersion), sys::JNI_ENOMEM => Err(JniError::NoMemory), sys::JNI_EEXIST => Err(JniError::AlreadyCreated), sys::JNI_EINVAL => Err(JniError::InvalidArguments), _ => Err(JniError::Other(code)), } .map_err(Error::JniCall) } pub struct Exception { pub class: String, pub msg: String, } pub trait ToException { fn to_exception(&self) -> Exception; }