JNI学习总结

标签(空格分隔): java


JNI:Java Native Interface,是一种通过java调用本地方法的技术(当然也可以反过来),随着JDK版本的提升,JNI的效率也一直在提升。


JNI的主要实现流程:

  • 在类中以关键字native标记需要通过JNI调用的本地方法;
  • 在类中通过static代码块的方式加载DLL,System.loadLibrary("***.dll");
  • 将该类编译为字节码文件;
  • 使用javah -jni ***.class从该class产生对应的JNI头文件。该头文件中包含以全限定名标识的JNI方法的声明;
  • 根据头文件来编写响应的实现代码;(需要注意Java与本地方法之间的类型映射关系)
  • 将JNI实现编译为动态链接库。

何时使用JNI:

  • 需要直接操作物理设备,而缺乏相关的驱动,则可以通过C或汇编来实现驱动,通过JNI来操作设备;
  • 含有大量的数学运算,使用纯java实现相对效率较低;
  • 已有大量可重用的C/C++实现;
  • 包含Java难以应付的开销,如大量的网络连接;
  • 进程间通信,比如调用MATLAB联合仿真。

使用JNI时需要注意的性能问题:

  • 应尽量减少越界访问,如频繁地调用(env)->FindClass、(env)->GetMethodID以及(env)->GetFieldID等方法。由于类一旦加载,字段和方法ID不会再发生变化,可在本地代码中缓存类,字段和方法ID,达到重用的目的;
  • 尽量少的去创建数组的副本,如果只使用数组的一部分,可以只创建该区域的副本;
  • 如果传值可以达到目的,最好不要传对象的引用,从而避免越界访问;
  • 对于本地引用,应在使用结束后调用DeleteLocalRef() 显示删除该引用,若需要保存大量的本地引用,需要通过EnsureLocalCapacity()方法通知JVM;
  • 定义好问题边界。

使用JNI时需要注意的安全问题:

  • 为每个getXXX调用releaseXXX(将数组写回);
  • JVM中每个线程都有自己的JNIEnv,因此在多线程环境中不应该使用其他线程的Env,避免取得错误的值;
  • 检测异常;
  • 检测返回值;
  • 记得释放全局引用,因为在创建全局引用时,jvm会将其加入到一个禁止垃圾回收的列表中去。如果在本地方法返回时没有释放该全局引用,可能会造成内存泄漏;
  • 确保代码不会在 GetXXXCritical() 和 ReleaseXXXCritical() 调用之间发起任何 JNI 调用或由于任何原因出现阻塞。

参考:
http://joanzq.iteye.com/blog/161152
http://www.ibm.com/developerworks/cn/java/j-jni/

最新文章

  1. Redis实战阅读笔记——第一章
  2. sublime text 下的Markdown写作
  3. spring mvc配置完后实现下载功能
  4. jQuery 之父:每天写代码
  5. java使用siger 获取服务器硬件信息(CPU 内存 网络 io等)
  6. hdu_4824_Disk Schedule(dp)
  7. 介绍一种非常好用汇总数据的方式GROUPING SETS
  8. Redis主从和HA配置
  9. [转] golang中struct、json、map互相转化
  10. java中的JSON数据转换方法fastjson
  11. 移动web图片加载完获取img宽高
  12. PHP连接MySQL查询中文时显示Notice: Trying to get property of non-object
  13. Mac上安装mysqlclient的报错
  14. windos上安装jenkins部署springboot的jar包(未运行,只是在打包并上传linux成功了)
  15. C++11 类型后置语法
  16. 个人经验~mysql故障处理思路
  17. 笔记 : WampServe加装PHP版本(7.2.3)为例
  18. python变量存储和深浅拷贝
  19. ELK简单部署
  20. 百度地图地址查询API使用

热门文章

  1. Yii防注入攻击笔记
  2. [每日一题] 11gOCP 1z0-053 :2013-10-9 backup with the KEEP option....................................33
  3. Python自动安装第三方类库
  4. C#常用的集合类型(ArrayList类、Stack类、Queue类、Hashtable类、SortedList类)
  5. Delphi调用java开发的WebService,传入参数出错
  6. php连接oracle
  7. The Tangled Web (Web之困)第四章 摘要
  8. Calendar类的基本使用
  9. 【Android】 onSaveInstanceState()恢复数据
  10. H5上传文件