diff --git a/dlsmk/Cargo.toml b/dlsmk/Cargo.toml
new file mode 100644
index 0000000..4042d47
--- /dev/null
+++ b/dlsmk/Cargo.toml
@@ -0,0 +1,19 @@
+[package]
+name = "dlsmk"
+version = "0.1.0"
+authors = ["Tang Cheng <cheng.tang@supwisdom.com>"]
+edition = "2018"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[target.'cfg(target_os="android")'.dependencies]
+jni = { version = "0.18.0", default-features = false }
+
+[lib]
+crate-type = ["cdylib"]
+
+[dependencies]
+jni = "0.18.0"
+dlqrcode = { path = "../daliqrcode" }
+libc = "0.2.80"
+hex = "0.4.2"
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;
+            },
+        };
+    }
+}
