blob: 402a0c05a8d862bd7644713692bc30e67f0b8b18 [file] [log] [blame]
Tang Cheng88643892020-10-31 22:00:07 +08001#[cfg(test)]
2mod 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)]
25pub 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}