initialize commit
diff --git a/dlsmk/src/lib.rs b/dlsmk/src/lib.rs
new file mode 100644
index 0000000..402a0c0
--- /dev/null
+++ b/dlsmk/src/lib.rs
@@ -0,0 +1,108 @@
+#[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;
+            },
+        };
+    }
+}