Tang Cheng | 8864389 | 2020-10-31 22:00:07 +0800 | [diff] [blame^] | 1 | #[cfg(test)] |
| 2 | mod tests { |
| 3 | #[test] |
| 4 | fn it_works() { |
| 5 | assert_eq!(2 + 2, 4); |
| 6 | } |
| 7 | } |
| 8 | |
| 9 | // use std::ffi::{CStr, CString}; |
| 10 | // use std::os::raw::{c_char, c_uchar, c_ulong}; |
| 11 | |
| 12 | // #[no_mangle] |
| 13 | // pub extern "C" fn dlsmk_decode( |
| 14 | // key: *const c_uchar, |
| 15 | // qrcode: *const c_uchar, |
| 16 | // qrlen: c_ulong, |
| 17 | // ) -> *mut c_char { |
| 18 | // CString::new("Hello ".to_owned()).unwrap().into_raw() |
| 19 | // } |
| 20 | |
| 21 | // #[cfg(target_os = "android")] |
| 22 | #[cfg(any(target_family = "unix", target_os = "android"))] |
| 23 | // #[cfg(target_family = "unix")] |
| 24 | #[allow(non_snake_case)] |
| 25 | pub mod android { |
| 26 | extern crate jni; |
| 27 | |
| 28 | use self::jni::objects::{JClass, JObject, JString}; |
| 29 | use self::jni::sys::{jboolean, jlong, JNI_FALSE, JNI_TRUE}; |
| 30 | use self::jni::JNIEnv; |
| 31 | // use super::*; |
| 32 | use libc; |
| 33 | use std::slice; |
| 34 | |
| 35 | use dlqrcode::DaliQrCode; |
| 36 | |
| 37 | #[no_mangle] |
| 38 | pub unsafe extern "C" fn Java_com_supwisdom_dlsmk_DLSMKQrCode_decode( |
| 39 | env: JNIEnv, |
| 40 | _: JClass, |
| 41 | key_hex: JString, |
| 42 | qrcode: JString, |
| 43 | offset: jlong, |
| 44 | result: JObject, |
| 45 | ) -> jboolean { |
| 46 | // Our Java companion code might pass-in "world" as a string, hence the name. |
| 47 | let key = env |
| 48 | .get_string(key_hex) |
| 49 | .expect("invalid key string") |
| 50 | .as_ptr(); |
| 51 | let keylen = libc::strlen(key); |
| 52 | |
| 53 | println!("decode test, key length {}", keylen); |
| 54 | let key = { |
| 55 | let k: &[u8] = slice::from_raw_parts(key as *const u8, keylen); |
| 56 | println!("key is : {}", String::from_utf8_lossy(k)); |
| 57 | let mut key = [0u8; 32]; |
| 58 | if let Ok(v) = hex::decode(k) { |
| 59 | key.clone_from_slice(v.as_slice()); |
| 60 | key |
| 61 | } else { |
| 62 | return JNI_FALSE; |
| 63 | } |
| 64 | }; |
| 65 | |
| 66 | let qrcode = env |
| 67 | .get_string(qrcode) |
| 68 | .expect("invalid qrcode string") |
| 69 | .as_ptr(); |
| 70 | let qrlen = libc::strlen(qrcode); |
| 71 | |
| 72 | |
| 73 | let decode = match DaliQrCode::new(key, None, None, None, None) { |
| 74 | Ok(d) => d, |
| 75 | Err(e) => panic!("invalid key {}", e), |
| 76 | }; |
| 77 | |
| 78 | println!("decode qrcode begin , length : {}...", qrlen); |
| 79 | match decode.decode(qrcode as *const u8, qrlen, offset as i32) { |
| 80 | Ok(d) => { |
| 81 | let qrdata = env.get_map(result).expect("invalid qrdata map"); |
| 82 | qrdata |
| 83 | .put( |
| 84 | *env.new_string("cardno").unwrap(), |
| 85 | *env.new_string(d.cardno).unwrap(), |
| 86 | ) |
| 87 | .unwrap(); |
| 88 | qrdata |
| 89 | .put( |
| 90 | *env.new_string("cardtype").unwrap(), |
| 91 | *env.new_string(d.cardtype).unwrap(), |
| 92 | ) |
| 93 | .unwrap(); |
| 94 | qrdata |
| 95 | .put( |
| 96 | *env.new_string("uid").unwrap(), |
| 97 | *env.new_string(d.uid).unwrap(), |
| 98 | ) |
| 99 | .unwrap(); |
| 100 | return JNI_TRUE; |
| 101 | } |
| 102 | Err(e) => { |
| 103 | println!("Error {:?}", e); |
| 104 | return JNI_FALSE; |
| 105 | }, |
| 106 | }; |
| 107 | } |
| 108 | } |