| #[cfg(test)] | 
 | mod tests { | 
 |     #[test] | 
 |     fn it_works() { | 
 |         assert_eq!(2 + 2, 4); | 
 |     } | 
 | } | 
 |  | 
 | // use std::ffi::{CStr, CString}; | 
 | // use std::os::raw::{c_char, c_uchar, c_ulong}; | 
 |  | 
 | // #[no_mangle] | 
 | // pub extern "C" fn dlsmk_decode( | 
 | //     key: *const c_uchar, | 
 | //     qrcode: *const c_uchar, | 
 | //     qrlen: c_ulong, | 
 | // ) -> *mut c_char { | 
 | //     CString::new("Hello ".to_owned()).unwrap().into_raw() | 
 | // } | 
 |  | 
 | // #[cfg(target_os = "android")] | 
 | #[cfg(any(target_family = "unix", target_os = "android"))] | 
 | // #[cfg(target_family = "unix")] | 
 | #[allow(non_snake_case)] | 
 | pub mod android { | 
 |     extern crate jni; | 
 |  | 
 |     use self::jni::objects::{JClass, JMap, JObject, JString}; | 
 |     use self::jni::sys::{jboolean, jlong, JNI_FALSE, JNI_TRUE}; | 
 |     use self::jni::JNIEnv; | 
 |     // use super::*; | 
 |     use libc; | 
 |     use std::slice; | 
 |  | 
 |     use dlqrcode::DaliQrCode; | 
 |  | 
 |     fn put_data(env: &JNIEnv, map: &JMap, key: &str, value: &str) { | 
 |         map.put( | 
 |             *env.new_string(key).unwrap(), | 
 |             *env.new_string(value).unwrap(), | 
 |         ) | 
 |         .unwrap(); | 
 |     } | 
 |  | 
 |     #[no_mangle] | 
 |     pub unsafe extern "C" fn Java_com_supwisdom_dlsmk_DLSMKQrCode_decode( | 
 |         env: JNIEnv, | 
 |         _: JClass, | 
 |         key_hex: JString, | 
 |         qrcode: JString, | 
 |         offset: jlong, | 
 |         result: JObject, | 
 |     ) -> jboolean { | 
 |         let key = { | 
 |             let s = env | 
 |                 .get_string(key_hex) | 
 |                 .expect("invalid key string") | 
 |                 .as_ptr(); | 
 |             let keylen = libc::strlen(s); | 
 |             let mut k = Vec::new(); | 
 |             k.extend_from_slice(slice::from_raw_parts(s as *const u8, keylen)); | 
 |             k | 
 |         }; | 
 |  | 
 |         let qrcode = { | 
 |             let s = env | 
 |                 .get_string(qrcode) | 
 |                 .expect("invalid qrcode string") | 
 |                 .as_ptr(); | 
 |             let qrlen = libc::strlen(s); | 
 |             let mut q = Vec::new(); | 
 |             q.extend_from_slice(slice::from_raw_parts(s as *const u8, qrlen)); | 
 |             q | 
 |         }; | 
 |  | 
 |         let qrdata = env.get_map(result).expect("invalid qrdata map"); | 
 |  | 
 |         let key = { | 
 |             let mut k = [0u8; 32]; | 
 |             if let Ok(v) = hex::decode(key.as_slice()) { | 
 |                 k.clone_from_slice(v.as_slice()); | 
 |                 k | 
 |             } else { | 
 |                 put_data( | 
 |                     &env, | 
 |                     &qrdata, | 
 |                     "error", | 
 |                     "key must be hex format and 64 characters", | 
 |                 ); | 
 |                 return JNI_FALSE; | 
 |             } | 
 |         }; | 
 |  | 
 |         let decode = match DaliQrCode::new(key, None, None, None, None) { | 
 |             Ok(d) => d, | 
 |             Err(e) => { | 
 |                 let s = format!("invalid input parameter {:?}", e); | 
 |                 put_data(&env, &qrdata, "error", &s); | 
 |                 return JNI_FALSE; | 
 |             } | 
 |         }; | 
 |  | 
 |         match decode.decode(qrcode.as_ptr(), qrcode.len(), offset as i32) { | 
 |             Ok(d) => { | 
 |                 qrdata | 
 |                     .put( | 
 |                         *env.new_string("cardno").unwrap(), | 
 |                         *env.new_string(d.cardno).unwrap(), | 
 |                     ) | 
 |                     .unwrap(); | 
 |                 qrdata | 
 |                     .put( | 
 |                         *env.new_string("cardtype").unwrap(), | 
 |                         *env.new_string(d.cardtype).unwrap(), | 
 |                     ) | 
 |                     .unwrap(); | 
 |                 qrdata | 
 |                     .put( | 
 |                         *env.new_string("uid").unwrap(), | 
 |                         *env.new_string(d.uid).unwrap(), | 
 |                     ) | 
 |                     .unwrap(); | 
 |                 return JNI_TRUE; | 
 |             } | 
 |             Err(e) => { | 
 |                 let s = format!("{:?}", e); | 
 |                 put_data(&env, &qrdata, "error", &s); | 
 |                 return JNI_FALSE; | 
 |             } | 
 |         }; | 
 |     } | 
 | } |