Best practices for using the Java Native Interface
https://developer.ibm.com/articles/j-jni/
非常好的文章,编写JNI需要注意的事项,我整理了一下包括:
- 做好fieldID, methodID, class的缓存避免重复查询
- 获取Array/String的话根据JVM实现可能会有copy, 所以选择合适的chunk size去遍历
- 避免C++/Java端有太多的切换,总之就是要减少JNI function calls. 这个包括设计好两者的边界。
- 避免产生太多的local ref, 定期就要release local ref.
- JNIEnv和thread绑定,如果不确定的话JNIEnv是否正确,就要调用 `GetEnv`
- 不要忘记检查异常和返回值
- 不要忘记释放global ref, 这个是gc scan root.
- Array/String操作的话都是需要使用Get/Relase配对接口的. 如果JVM实现的是copy出来内容的话,Release接口还负责把内容拷贝回去。
see also The Java™ Native Interface Programmer’s Guide and Specification