Best practices for using the Java Native Interface

https://developer.ibm.com/articles/j-jni/

非常好的文章,编写JNI需要注意的事项,我整理了一下包括:

  1. 做好fieldID, methodID, class的缓存避免重复查询
  2. 获取Array/String的话根据JVM实现可能会有copy, 所以选择合适的chunk size去遍历
  3. 避免C++/Java端有太多的切换,总之就是要减少JNI function calls. 这个包括设计好两者的边界。
  4. 避免产生太多的local ref, 定期就要release local ref.
  5. JNIEnv和thread绑定,如果不确定的话JNIEnv是否正确,就要调用 `GetEnv`
  6. 不要忘记检查异常和返回值
  7. 不要忘记释放global ref, 这个是gc scan root.
  8. Array/String操作的话都是需要使用Get/Relase配对接口的. 如果JVM实现的是copy出来内容的话,Release接口还负责把内容拷贝回去。

see also The Java™ Native Interface Programmer’s Guide and Specification