JNI学习总结
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/
JNI学习总结的更多相关文章
- 【转】JNI学习积累之一 ---- 常用函数大全
原文网址:http://blog.csdn.net/qinjuning/article/details/7595104 本文原创,转载请注明出处:http://blog.csdn.net/qinjun ...
- Android JNI学习(五)——Demo演示
本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...
- Android JNI学习(四)——JNI的常用方法的中文API
本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...
- Android JNI学习(三)——Java与Native相互调用
本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...
- Android JNI学习(二)——实战JNI之“hello world”
本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...
- JNI学习笔记_Java调用C —— 非Android中使用的方法
一.学习笔记 1.java源码中的JNI函数本机方法声明必须使用native修饰. 2.相对反编译 Java 的 class 字节码文件来说,反汇编.so动态库来分析程序的逻辑要复杂得多,为了应用的安 ...
- Android JNI 学习(一):JNI 简介
JNI 即 Java Native Interface 是 native 编程接口,它允许在Java虚拟机(VM)内运行Java代码与其他编程语言(主要是C和C++)编写的应用程序和库进行交互操作. ...
- JNI学习积累之三 ---- 操作JNI函数以及复杂对象传递
本文原创,转载请注明出处:http://blog.csdn.NET/qinjuning 在掌握了JNI函数的使用和相关类型的映射后,以及知晓何利用javah工具生成对应的jni函数以及如何生成动态 链 ...
- jni学习
Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互.JNI 是本地编程接口,它使得在 Java 虚拟机(VM) 内部运行的 ...
随机推荐
- 使用WIF实现单点登录Part II —— Windows Identity Foundation基本原理 -摘自网络
在上一篇文章中,我们已经使用WIF构建了一个基于MVC4的简单的身份验证程序,在这篇文章里,我们将探讨一下到底什么是WIF,以及它的工作原理.然后在下一篇文章开始,我们将实际操作,实现单点登录功能. ...
- rcp(插件开发)The type XXX cannot be resolved. It is indirectly referenced from required .class files解决办法
如果你在使用插件开发时遇到这个问题: The type org.eclipse.core.resources.IFile cannot be resolved. It is indirectly re ...
- linuxmint获取root
1.进入系统à点击桌面左下角的菜单à点击系统设置 2. 在系统设置里面找到登陆窗口并进去 3.打入自己设置的开机登陆密码 4. 选择选项,并把运行root登陆的勾打上 5.重启生效
- 第二步 在D2RQ平台上配置jena环境
第二步 在D2RQ平台上配置jena环境 2013年10月16日 9:48:53 搞了这么长时间语义,只用过protege这样的工具,一直没有落实到实际代码上.jena也看过好久了,总认为是hp公司的 ...
- opencv基础知识-videowriter
一.前言-简介 在试验中需要常常将实验结果进行保存,在opencv中提供很好用的录制视频的句柄,也可称之为类-videowriter. videowriter应用那是相当的简单,总之分为三步: //声 ...
- 编译Android4.3内核源代码
--------------------------------------------------------------------------------------------------- ...
- Tomcat 优化
1.apr 许多朋友可能在启动tomcat的时候都会看到类似这样的信息: 引用 org.apache.catalina.core.AprLifecycleListener init 信息: The A ...
- G++ 教程(转)
简介 gcc and g++分别是GNU的c & c++编译器 gcc/g++在执行编译工作的时候,总共需要4步 1.预处理,生成.i的文件[预处理器cpp] 2.将预处理后的文 ...
- 得到当前堆栈信息的两种方式(Thread和Throwable)的纠结
今天进行slf4j中logger的同步封装.主要目的是为了以后方便更换日志实现系统. 遇到的问题:使用Thread.currentThread().getStackTrace()[1].getClas ...
- block_dump观察Linux IO写入的具体文件(mysqld)
一.使用方法: 二.基本原理: 三.总结 很多情况下开发者调测程序需要在Linux下获取具体的IO的状况,目前常用的IO观察工具用vmstat和iostat,具体功能上说当然是iostat更胜一筹 ...