本次坑不大不小,在此记录一下,希望能够帮助遇到同样问题的朋友。
1.背景
最近在进行Seetaface6开源人脸识别库的Java封装工作。封装工作初步完成后,Java端进行封装测试,调用库dll文件都成功了,但调用本地Native方法(dll中的方法)时,报错:java.lang.UnsatisfiedLinkError,然后就没有其他任何提示信息了!跟其他人遇到的都不一样。
2.排坑
经过排查,实际错误发生的原因很简单,但是因为没有任何有价值的错误信息提示,导致坑了一定时间。
JNI开发时,根据Java中Native方法所在的类,比如名叫:com.aaa.bbb.MyClass,会对应生成一个名为“com_aaa_bbb_MyClass.h”的头文件,然后再引入到C/C++工程中,进行dll库的开发。
然后在Java端加载dll库,并调用MyClass中的Native方法就可以了。但我犯了一个致命错误,我把MyClass的包,最终改为了比如:com.xxx.yyy.MyClass,导致调用Native方法时报出“java.lang.UnsatisfiedLinkError”的错误(问题是还没有其他多余信息提示),从而引起JVM崩溃整个程序退出。
3.结论
最终结论:关键点就在于:“Java端Native方法所在类名称和包名必须与C端一致”!意思就是com.aaa.bbb.MyClass这个从包名到类名一个字都不能改!!!
我把com.xxx.yyy.MyClass改回com.aaa.bbb.MyClass再调用Native方法就正常了。
这个坑是我大意了,也希望其他朋友要小心这一点。