前言
最近在和第三方联调接口,接口签名算法需要使用Hmac签名算法,本来服务已经在拦截器中写了一套签名校验逻辑,正在和第三方联调,但是由于中台组计划做个一个通用的API网关,后续所有的外部接口都要经过API网关,为了保证后续迁移的可行性,所以服务本身的签名校验规则需要和API网关保持一致,按照中台组提供的Hmac算法需要依赖dll动态库,中台组提供了dll文件,这边先在本地进行调试。调试过程中出现下面这货
解决思路
由于之前没有使用过java调用DLL动态库,所以遇到这个异常也是一头雾水,在网上查了,有类似问题,说DLL文件位置不对或者DLL文件本身有问题。但是中台组提供的调用demo里面的确是可以调用成功的,说明DLL文件本身没有问题。而且断点调试发现加载DLL的地方是没有问题的,由于要在本地调式,我把中台组提供的demo服务中的Hmac类拷贝到自己的服务中来了,当时没有考虑到这个类的包名问题,就按照服务的当前目录结构,把hmac类扔到服务的util包下了,结果就出现上面的异常了。
大家在下图可以看到就是HmacLib类被我直接仍在util目录下面,这个目录是有问题的,需要把HmacLib类放在生成头文件类包路径下,由于这个编译这个DLL文件的人暂时联系不到,我这边就把HmacLib类保持和中台组提供的签名demo中的HmacLib类包名一致就行了。
其实Jni就是我们将Java的class文件编译成c的.h文件,之后根据头文件来编写源文件。所以这个过程中就会有相对应和一致的要求,我想你可能已经猜到了,就是类的包路径要和生成头文件类包路径一致。否则不是找不到方法,就是实例化不了。