| #[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; |
| } |
| }; |
| } |
| } |