blob: 402a0c05a8d862bd7644713692bc30e67f0b8b18 [file] [log] [blame]
#[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;
},
};
}
}