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) 内部运行的 ...
随机推荐
- 通过分析 JDK 源代码研究 Hash 存储机制
通过 HashMap.HashSet 的源代码分析其 Hash 存储机制 实际上,HashSet 和 HashMap 之间有很多相似之处,对于 HashSet 而言,系统采用 Hash 算法决定集合元 ...
- python 多行字符串
字符串是要用引号(双引号,单引号,多行用三个引号)引起来 TypeError: not enough arguments for format string you have to specify m ...
- Ⅴ.spring的点点滴滴--引用其他对象或类型的成员
承接上文 引用其他对象或类型的成员 .net篇(环境为vs2012+Spring.Core.dll v1.31) public class Person { public string Name { ...
- input输入框默认文字,点击消失
<input type="text" value="请输入用户名" onfocus="if(value=='请输入用户名') {value='' ...
- 按需讲解之Supervisor
Supervisor是一个进程监控程序. 满足的需求是:我现在有一个进程需要每时每刻不断的跑,但是这个进程又有可能由于各种原因有可能中断.当进程中断的时候我希望能自动重新启动它,此时,我就需要使用到了 ...
- 大数据与可靠性会碰撞出什么样的Spark?
可靠性工程领域的可靠性评估,可靠性仿真计算,健康检测与预管理(PHM)技术,可靠性试验,都需要大规模数据来进行支撑才能产生好的效果,以往这些数据都是不全并且收集困难,而随着互联网+的大数据时代的来临, ...
- 数据库数据导入导出系列之五 C#实现动态生成Word(转)
1. 一个控制台例子,实现动态生成Word. 首先,添加引用:COM->Microsoft Word 11.0 Object Library. 2. 介绍几篇牛人写的关于操作Word的文章 [分 ...
- android模拟器经常出现的一些问题及解决办法
1.Unable to get view server version from device exlipse下编写好android应用程序时候,右键项目 run as android applica ...
- [原理][源代码解析]spring中@Transactional,Propagation.SUPPORTS,以及 Hibernate Session,以及jdbc Connection关系---转载
问题: 一. 1. Spring 如何处理propagation=Propagation.SUPPORTS? 2. Spring 何时生成HibernateSession ? 3. propagati ...
- jsp----在jsp中写java代码(变量和函数方法)
<%@page import="java.text.SimpleDateFormat"%><%@page language="java" im ...