1.UnsatisfiedlinkError:dll名称。说明dll没有放到合适的位置。对于Android开发,我们一般把so放在libs目录下,但是还是会出现这个错误。根本原因System.loadLibrary函数会加载你指定的so,该so中需要链接的所有符号都需要能够链接到,如果有一个链接不成功,那么整个so也会加载失败。仔细检查so中需要的所有符号,确保其存在且在正确的位置上。
2.是UnsatisfiedlinkError:方法名称。说明dll已经成功加载,但是方法名字错了。这个错误最最常见而且基本的解决方法是:仔细对比你的native 方法的原型确保与javah生成的原型一致。在java端修改native方法名称一定要记得更新c/c++端的函数名称,这是造成此类错误最常见的原因。
3.JNI是采用了C风格的函数命名,所以如果用C++编译,则必须记得在每个函数前加上extern "C"的标记。
4.local/global reference这些概念,只是跟jobject的指针相关(包括它的派生类如jclass),因为这些指针所指空间,如果为local的话,则会在作用域结束时被回收,所以做cache时才需要转化为global reference。
而jfieldID和jmethodID查看头文件便可知与jobject无关,只是一些native的空间分配,因此与local/global这些JNI加入的新概念无关,按C/C++的做法去cache即可。
5.GetStringRegion和GetStringUTFRegion的特别提醒
这两个函数都有一个len的参数,表示Unicode字符的个数,但是要注意,这两个函数会在copy完字符串后,还会操作数组的第len+1个元素(GetStringUTFRegion会把[len+1]赋值为0,但是GetStringRegion很奇怪,并不会把[len+1]赋为0)!因此分配空间时就要分配len+1,否则嘛。。你的程序随时crash(当你执行delete[]时)