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学习总结的更多相关文章

  1. 【转】JNI学习积累之一 ---- 常用函数大全

    原文网址:http://blog.csdn.net/qinjuning/article/details/7595104 本文原创,转载请注明出处:http://blog.csdn.net/qinjun ...

  2. Android JNI学习(五)——Demo演示

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

  3. Android JNI学习(四)——JNI的常用方法的中文API

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

  4. Android JNI学习(三)——Java与Native相互调用

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

  5. Android JNI学习(二)——实战JNI之“hello world”

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

  6. JNI学习笔记_Java调用C —— 非Android中使用的方法

    一.学习笔记 1.java源码中的JNI函数本机方法声明必须使用native修饰. 2.相对反编译 Java 的 class 字节码文件来说,反汇编.so动态库来分析程序的逻辑要复杂得多,为了应用的安 ...

  7. Android JNI 学习(一):JNI 简介

    JNI 即 Java Native Interface 是 native 编程接口,它允许在Java虚拟机(VM)内运行Java代码与其他编程语言(主要是C和C++)编写的应用程序和库进行交互操作. ...

  8. JNI学习积累之三 ---- 操作JNI函数以及复杂对象传递

    本文原创,转载请注明出处:http://blog.csdn.NET/qinjuning 在掌握了JNI函数的使用和相关类型的映射后,以及知晓何利用javah工具生成对应的jni函数以及如何生成动态 链 ...

  9. jni学习

    Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互.JNI 是本地编程接口,它使得在 Java 虚拟机(VM) 内部运行的 ...

随机推荐

  1. HDU3695 - Computer Virus on Planet Pandora(AC自动机)

    题目大意 给定一个文本串T,然后给定n个模式串,问有多少个模式串在文本串中出现,正反都可以 题解 建立好自动机后.把文本串T正反各匹配一次,刚开始一直TLE...后面找到原因是重复的子串很多以及有模式 ...

  2. ORA-01653:表空间扩展失败的问题(开启表空间自动扩展)

    ----查询表空间使用情况---使用DBA权限登陆SELECT UPPER(F.TABLESPACE_NAME) "表空间名",D.TOT_GROOTTE_MB "表空间 ...

  3. 高密度Java应用部署的一些实践

    传统的Java应用部署模式,一般遵循“硬件->操作系统->JVM->Java应用”这种自底向上的部署结构,其中JEE应用可以细化为“硬件->操作系统->JVM->J ...

  4. light oj 1294 - Positive Negative Sign

    1294 - Positive Negative Sign   PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: ...

  5. maven工程-eclipse红叹号

    从公司代码库中check下一份完整代码,在其他开发机器上都能正确构建,唯独一台机器无法正确构建,查证了2个小时,最后还是死在了最基础的问题上 maven工程 工程如下,创建了一个新的maven工程,j ...

  6. xcode6 自定义UITabbarController

    -(void)initTabBarView{ if (tabBarController && [kAPPDELEGATE.navigationController.viewContro ...

  7. SMB带宽限制

    1.安装SMB带宽限制功能 Add-WindowsFeature FS-SMBBW 2.通过PowerShell命令限制SMB带宽 #限制非Hyper-V over SMB or Live Migra ...

  8. windows 7 64位 安装oracle 11g R2

    1.下载Oracle 11g R2 for Windows的版本 下载地址: http://www.oracle.com/technetwork/database/enterprise-edition ...

  9. OC最实用的runtime总结,面试、工作你看我就足够了!

    前言 runtime的资料网上有很多了,部分有些晦涩难懂,我通过自己的学习方法总结一遍,主要讲一些常用的方法功能,以实用为主,我觉得用到印象才是最深刻的,并且最后两个demo也是MJExtension ...

  10. Android(java)学习笔记165:Android的Junit调试

    编写android应用的时候,往往我们需要编写一些业务逻辑实现类,但是我们可能不能明确这个业务逻辑是否可以成功实现,特别是逻辑代码体十分巨大的时候,我们不可能一行一行检查自己的代码,为了解决这样的问题 ...