| #[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, 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; |
| |
| #[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 { |
| // Our Java companion code might pass-in "world" as a string, hence the name. |
| let key = env |
| .get_string(key_hex) |
| .expect("invalid key string") |
| .as_ptr(); |
| let keylen = libc::strlen(key); |
| |
| println!("decode test, key length {}", keylen); |
| let key = { |
| let k: &[u8] = slice::from_raw_parts(key as *const u8, keylen); |
| println!("key is : {}", String::from_utf8_lossy(k)); |
| let mut key = [0u8; 32]; |
| if let Ok(v) = hex::decode(k) { |
| key.clone_from_slice(v.as_slice()); |
| key |
| } else { |
| return JNI_FALSE; |
| } |
| }; |
| |
| let qrcode = env |
| .get_string(qrcode) |
| .expect("invalid qrcode string") |
| .as_ptr(); |
| let qrlen = libc::strlen(qrcode); |
| |
| |
| let decode = match DaliQrCode::new(key, None, None, None, None) { |
| Ok(d) => d, |
| Err(e) => panic!("invalid key {}", e), |
| }; |
| |
| println!("decode qrcode begin , length : {}...", qrlen); |
| match decode.decode(qrcode as *const u8, qrlen, offset as i32) { |
| Ok(d) => { |
| let qrdata = env.get_map(result).expect("invalid qrdata map"); |
| 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) => { |
| println!("Error {:?}", e); |
| return JNI_FALSE; |
| }, |
| }; |
| } |
| } |