JNI与JNA性能比较

在介绍JNA时,提到了JNA是基于JNI的,是在JNI上封装了一层,JNI性能不如JNA。最近在网上看到篇简单的比较这两者性能的文档,感觉不错,现转载一下:

分别用JNI和JNA的方式建立dll,dll中包含一个get方法和一个set方法,在Java端进行循环调用1000*1000次,比较所耗费的时间。

JNI和JNA调用的不是同一个dll,但是功能和代码基本相同。本测试从一定角度反映他们的性能。

【JNI实现】

先编写Java相关的native方法:

  1. package crayon.jni;
  2. public class JNITest {
  3. public native static void set(int i);
  4. public native static int get();
  5. static{
  6. System.loadLibrary("JNITest");
  7. }
  8. }

然后利用javah命令从上述带native方法的class文件导出.h头文件,并编写C代码实现为:

  1. #include "stdafx.h"
  2. #include "JNITest.h"
  3. long tmp = 0;
  4. JNIEXPORT void JNICALL Java_crayon_jni_JNITest_set
  5. (JNIEnv *, jclass, jint value){
  6. tmp = value;
  7. }
  8. JNIEXPORT jint JNICALL Java_crayon_jni_JNITest_get
  9. (JNIEnv *, jclass){
  10. return tmp;
  11. }

生成dll动态链接库,并测试,最后时间为:

  1. package crayon.jni;
  2. public class TestJNI {
  3. public static void main(String[] args) {
  4. long beginTime = System.currentTimeMillis();
  5. int i;int j;
  6. for(i=0;i<1000;i++){
  7. for(j=0;j<1000;j++){
  8. JNITest.set(i*j);
  9. JNITest.get();
  10. }
  11. }
  12. long totalTime = System.currentTimeMillis()-beginTime;
  13. System.out.println("JNI消耗的总时间(ms):"+totalTime);
  14. }
  15. }
  1. JNI消耗的总时间(ms):16

【JNA实现】

对于JNA,我们可以直接先写C代码了,如下分别为.h文件和.cpp文件:

  1. #ifdef JNATEST_EXPORTS
  2. #define JNATEST_API __declspec(dllexport)
  3. #else
  4. #define JNATEST_API __declspec(dllimport)
  5. #endif
  6. extern "C" {
  7. JNATEST_API void set(long l);
  8. JNATEST_API long get();
  9. }
  1. #include "stdafx.h"
  2. #include "JNATest.h"
  3. long tmp;
  4. JNATEST_API void set(long l){
  5. tmp = l;
  6. }
  7. JNATEST_API long get(){
  8. return tmp;
  9. }

直接写Java端代码调用上述导出的dll文件,注意别忘记引入JNA相关的jar包,代码为:

  1. package crayon.jna;
  2. import com.sun.jna.Library;
  3. import com.sun.jna.Native;
  4. public interface JNATest extends Library {
  5. JNATest INSTANCE = (JNATest) Native.loadLibrary(
  6. "D:/CC/Tools_Tool_ITT_StdPrj_Dev/PF_Tools_VOB/Tools_SubTool/src/JNATest/Release/JNATest", JNATest.class);
  7. public void set(int i);
  8. public int get();
  9. }

测试代码和结果为:

  1. package crayon.jna;
  2. import com.sun.jna.Library;
  3. import com.sun.jna.Native;
  4. public interface JNATest extends Library {
  5. JNATest INSTANCE = (JNATest) Native.loadLibrary(
  6. "D:/CC/Tools_Tool_ITT_StdPrj_Dev/PF_Tools_VOB/Tools_SubTool/src/JNATest/Release/JNATest", JNATest.class);
  7. public void set(int i);
  8. public int get();
  9. }
  1. JNA消耗的总时间(ms):2593

综上比较:JNI 16ms  << JNA 2593ms!!!性能差距还蛮大的!!

本着赤果果地实事求是地态度,我在自己的lenovo
昭阳K46(XP,处理器i3,内存升级4G--实际使用3G)的机器上测试了一下,结果为(取10次平均):JNI 120.5ms   JNA
4535.8ms !!我的本本貌似不是很给力,但测试结果整体趋势差不多!

这次试验,本身也有一个收获,就是:在JNI(或JNA)应用中,在Java端,我们会有一个对象,其中调用的方法都会映射到本地代码中,只要我们是同一个Java对象,我们同样可以将一个值在一次本地方法调用中设置到对象里,然后在下一次调用中使用。当然这个值是保存在本地代码中的。

JNI与JNA性能比较的更多相关文章

  1. jni之jni与jna的比较

    java开发过程中会遇到需要调用c/c++动态库(windows平台的dll和linux平台的so)的情况,可以使用JNI或者JNA技术. JNA基于JNI技术开发,主要在上层作了类型自动转换的封装, ...

  2. Android 性能优化(18)JNI优化:JNI Tips 提升性能技巧

    JNI Tips 1.In this document JavaVM and JNIEnv Threads jclass, jmethodID, and jfieldID Local and Glob ...

  3. JNI的替代者—使用JNA访问Java外部功能接口

    摘自:http://www.cnblogs.com/lanxuezaipiao/p/3635556.html JNI的替代者-使用JNA访问Java外部功能接口 1. JNA简单介绍 先说JNI(Ja ...

  4. JNA—JNI终结者

    JNA—JNI终结者 介绍 给大家介绍一个最新的访问本机代码的Java框架—JNA. JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的J ...

  5. 【C/C++开发】【Java开发】JNI的替代者—使用JNA访问Java外部功能接口

    JNI的替代者-使用JNA访问Java外部功能接口 1. JNA简单介绍 先说JNI(Java Native Interface)吧,有过不同语言间通信经历的一般都知道,它允许Java代码和其他语言( ...

  6. NDK(20)JNI的5大性能缺陷及优化技巧

    转自 : http://www.ibm.com/developerworks/cn/java/j-jni/index.html JNI 编程缺陷可以分为两类: 性能:代码能执行所设计的功能,但运行缓慢 ...

  7. JNI/NDK开发指南(九)——JNI调用性能測试及优化

    转载请注明出处:http://blog.csdn.net/xyang81/article/details/44279725 在前面几章我们学习到了.在Java中声明一个native方法,然后生成本地接 ...

  8. JNI的又一替代者—使用JNR访问Java外部函数接口(jnr-ffi)

    1. JNR简单介绍 继上文“JNI的替代者—使用JNA访问Java外部函数接口”,我们知道JNI越来越不受欢迎,JNI是编写Java本地方法以及将Java虚拟机嵌入本地应用程序的标准编程接口.它管理 ...

  9. Java跨语言调用,使用JNA访问Java外部接口

    1. JNA简单介绍 先说JNI(Java Native Interface)吧,有过不同语言间通信经历的一般都知道,它允许Java代码和其他语言(尤其C/C++)写的代码进行交互,只要遵守调用约定即 ...

随机推荐

  1. Python Open Flash Chart (pyOFC2) — Home

    Python Open Flash Chart (pyOFC2) - Home pyOFC2 Python Open Flash Chart 2

  2. [bzoj1003][ZJOI2006][物流运输] (最短路+dp)

    Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格 ...

  3. runtime的基本应用

    1.什么是runtime? runtime是一套底层的C语言API,包含很多强大实用的C语言数据类型和C语言函数,平时我们编写的OC代码,底层都是基于runtime实现的. 2.runtime有什么作 ...

  4. JS~重写alter与confirm,让它们变成fancybox风格

    插件与系统命令 对于很多JS弹框插件来说,都提供了alter,confirm等功能,如fancybox,Boxy等插件,今天来介绍一下如何将系统的alter和confirm替换成指定插件的alter和 ...

  5. 虚拟机设备直通的两种方式(Working in Progress)

    声明: 本博客欢迎转发.但请保留原作者信息! 博客地址:http://blog.csdn.net/halcyonbaby 内容系本人学习.研究和总结,如有雷同,实属荣幸! pci passthroug ...

  6. Android——SQLite实现面向对象CRUD

    android中SQLite的使用,事实上倒也不难.可是与JDBC操作数据库相比,这个还是有点不顺手,并且我好久没写底层的封装了,使用SSM框架这些都不须要考虑......好了,废话不多说.以下直接建 ...

  7. [Immutable.js] Working with Subsets of an Immutable.js Map()

    Immutable.js offers methods to break immutable structures into subsets much like Array--for instance ...

  8. JS中面向对象的,对象理解、构造函数、原型、原型链

    6.1 理解对象 6.1.1 对象属性类型 ECMS属性有两种类型:数据属性和访问器属性 1 数据属性 [[configurable]] 表示能否通过Delete 删除属性从而从新定义属性,能否修改属 ...

  9. IBM SPSS Modeler 预测建模基础(一)

    1.搜索下载IBM SPSS Modeler 14.1 32位 及 IBM SPSS Modeler 14.1 注册文件(破解布丁): 2.下载train.csv 及 test.csv: train. ...

  10. Hibernate常见接口说明

    (一)SessionFactory 1. getCurrentSession()和openSession()区别 getCurrentSession创建的session会和绑定到当前线程,而openS ...