modify
diff --git a/dlsmk/Cargo.toml b/dlsmk/Cargo.toml
index 4042d47..76c2eaa 100644
--- a/dlsmk/Cargo.toml
+++ b/dlsmk/Cargo.toml
@@ -14,6 +14,6 @@
[dependencies]
jni = "0.18.0"
-dlqrcode = { path = "../daliqrcode" }
+dlqrcode = { path = "../dlqrcode" }
libc = "0.2.80"
hex = "0.4.2"
diff --git a/dlsmk/src/lib.rs b/dlsmk/src/lib.rs
index 402a0c0..fa982de 100644
--- a/dlsmk/src/lib.rs
+++ b/dlsmk/src/lib.rs
@@ -25,7 +25,7 @@
pub mod android {
extern crate jni;
- use self::jni::objects::{JClass, JObject, JString};
+ use self::jni::objects::{JClass, JMap, JObject, JString};
use self::jni::sys::{jboolean, jlong, JNI_FALSE, JNI_TRUE};
use self::jni::JNIEnv;
// use super::*;
@@ -34,6 +34,14 @@
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,
@@ -43,42 +51,57 @@
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
+ 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 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),
+ Err(e) => {
+ let s = format!("invalid input parameter {:?}", e);
+ put_data(&env, &qrdata, "error", &s);
+ return JNI_FALSE;
+ }
};
- println!("decode qrcode begin , length : {}...", qrlen);
- match decode.decode(qrcode as *const u8, qrlen, offset as i32) {
+ match decode.decode(qrcode.as_ptr(), qrcode.len(), offset as i32) {
Ok(d) => {
- let qrdata = env.get_map(result).expect("invalid qrdata map");
qrdata
.put(
*env.new_string("cardno").unwrap(),
@@ -100,9 +123,10 @@
return JNI_TRUE;
}
Err(e) => {
- println!("Error {:?}", e);
+ let s = format!("{:?}", e);
+ put_data(&env, &qrdata, "error", &s);
return JNI_FALSE;
- },
+ }
};
}
}