一体机硬件绑定的原理及应用
一、案例描述
由于市场上的需要,需要开发一体机项目,将平台安装部署在硬件中,一起打包出售。在开发过程中遇到一个难题,怎么保证平台不被复用,怎么保证license的安全。在讨论的过程中,我们提出一种解决方法,将平台与一体机绑定,做license时,只给最少的权限。
二、背景技术及术语解释
JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他编程语言,只要调用约定受支持就可以了。使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的。例如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。
三、解决过程
1、 编写java代码
在项目中书写编写自己的代码,使用native关键字声明需要调用的方法。例如:
2、 编译java代码
在运行中输入cmd,进入代码的当前目录,输入JavacEnvironmentTools.java 生成EnvironmentTools.class
3、 创建.h文件
在第二步操作框中返回到com的父文件夹,输入javah com.hik.lrms.common.EnvironmentTools,生成com_hik_lrms_common_EnvironmentTools.h文件。
4、 编写实现代码并生成so文件
将第三部生成的.h文件提供给C/C++的开发人员,由他们完成方法实现并生成.so文件(windows系统则生成dll文件)。
5、 运行java程序
将so文件上传至linux系统的/home目录下,并在/etc/profile中设置路径(export LD_LIBRARY_PATH=/home),然后运行java程序。
6、 注意事项
由于开发环境不在linux系统,调试很麻烦,建议将readEnvironMent()读取到的信息,打印到日志,方便调试。由于使用native关键字,当方法未调用到时,程序会抛出error而不是Exception,捕获时需使用error。
4、总结
之前系统做了另外一种硬件绑定方法,由硬件组开发一个驱动,这个驱动开机自启动将硬件信息写入一个文件中,java程序去解析这个文件。这种做法带来一个问题,不够安全。1、硬件信息属于机密,不能被用户随意获取。2、当用户知道这个文件时,可以复制,达不到硬件绑定的目的。基于上面两种因素,我们使用JNI,调用C的接口获取硬件信息。这种方式带来的问题就是,不能够跨平台。当windows系统也要做硬件绑定时,只能重新开发。