【Java Native】【JNI与JNA性能的比较】
来源:互联网 发布:可以看韩剧的软件 编辑:程序博客网 时间:2024/05/21 09:29
分别用JNI和JNA的方式建立dll,dll中包含一个get方法和一个set方法,在java端进行循环调用1000*1000次,比较所耗费的时间。
JNI和JNA调用的不是同一个dll,但是功能和代码基本相同。本测试从一定角度反映他们的性能。
【相关代码】【JNI与JNA性能比较】下载:http://download.csdn.net/detail/crayonyi/4187992
本篇文章文档下载:http://download.csdn.net/detail/crayonyi/4187998
1. JNI实现
1.1. 编写javaNative方法
package crayon.jni;
public class JNITest {
public native static void set(int i);
public native static int get();
static{
System.loadLibrary("JNITest");
}
}
1.2. 生成对应的头文件。使用以下命令:
>javac –d ./JNITest.java
>javah –classpath ./crayon.jni.JNITest
生成头文件:crayon_jni_JNITest.h
1.3. 建立DLL工程,完成C代码实现。(注意,需要将jni的库文件引入到工程中。)
#include <jni.h>
#ifndef _Included_crayon_jni_JNITest
#define _Included_crayon_jni_JNITest
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT void JNICALL Java_crayon_jni_JNITest_set
(JNIEnv *, jclass, jint);
JNIEXPORT jint JNICALL Java_crayon_jni_JNITest_get
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
#include "stdafx.h"
#include "JNITest.h"
long tmp = 0;
JNIEXPORT void JNICALL Java_crayon_jni_JNITest_set
(JNIEnv *, jclass, jint value){
tmp = value;
}
JNIEXPORT jint JNICALL Java_crayon_jni_JNITest_get
(JNIEnv *, jclass){
return tmp;
}
生成对应的dll。
1.4. 测试代码
package crayon.jni;
public class TestJNI {
public static void main(String[] args) {
long beginTime = System.currentTimeMillis();
int i;int j;
for(i=0;i<1000;i++){
for(j=0;j<1000;j++){
JNITest.set(i*j);
JNITest.get();
}
}
long totalTime = System.currentTimeMillis()-beginTime;
System.out.println("JNI消耗的总时间(ms):"+totalTime);
}
}
// 输出结果
JNI消耗的总时间(ms):16
2. 使用JNA方式实现
2.1. 建立DLL工程,完成C代码实现。
#ifdef JNATEST_EXPORTS
#define JNATEST_API __declspec(dllexport)
#else
#define JNATEST_API __declspec(dllimport)
#endif
extern "C" {
JNATEST_API void set(long l);
JNATEST_API long get();
}
#include "stdafx.h"
#include "JNATest.h"
long tmp;
JNATEST_API void set(long l){
tmp = l;
}
JNATEST_API long get(){
return tmp;
}
2.2. 编写java端的interface。别忘了引入jna的库。
package crayon.jna;
import com.sun.jna.Library;
import com.sun.jna.Native;
public interface JNATest extends Library {
JNATest INSTANCE = (JNATest) Native.loadLibrary(
"D:/CC/Tools_Tool_ITT_StdPrj_Dev/PF_Tools_VOB/Tools_SubTool/src/JNATest/Release/JNATest", JNATest.class);
public void set(int i);
public int get();
}
2.3. 测试代码
package crayon.jna;
import com.sun.jna.Library;
import com.sun.jna.Native;
public interface JNATest extends Library {
JNATest INSTANCE = (JNATest) Native.loadLibrary(
"D:/CC/Tools_Tool_ITT_StdPrj_Dev/PF_Tools_VOB/Tools_SubTool/src/JNATest/Release/JNATest", JNATest.class);
public void set(int i);
public int get();
}
// 输出结果
JNA消耗的总时间(ms):2593
3. 结论
JNI消耗的总时间(ms)
JNA消耗的总时间(ms)
16
2593
性能:JNI>> JNA
- 【Java Native】【JNI与JNA性能的比较】
- JNI与JNA性能比较
- JNI与JNA性能比较
- JNI和JNA性能比较
- jna(jni的坑),java jni native方法去申请native heap 空间
- JNA (Java Native Access) 不通过JNI直接调用本地代码
- java 调 C (jni 与 jna)
- JNI性能测试一—JNI调用C与Java调用java性能比较
- Android 中Jni与Java运算性能比较
- 谁有java native access(jna)的学习资料
- Java JNA —— JNI的加强版
- JNI 和 JNA,java和其他语言的互调
- JNI开发中native层与Java层的交互
- android jni native 与java 交互
- java native方法与JNI实现
- Java调用本地C/C++动态库拾遗 JNI/JNA与名称粉碎
- 关于JNA、JNI的使用注意
- 重新对JNI(JNA)的认识
- servlet乱码解决一则&将request参数按字符串取出
- wp7天气预报源代码(四UI的制作)视觉状态
- 类的sizeof
- Windows Phone 7 自定义事件
- applet 运行
- 【Java Native】【JNI与JNA性能的比较】
- 普通应用使用Surface的方法
- 面向对象编程的初步
- window phone 独立存储空间的操作
- 清除mac 系统终端的历史命令记录
- Hough变换原理
- Windows Phone 7 中将Gb2312编码转换成UTF-8
- 【tarjan求割边】PKU-3694-Network
- Oracle基础学习笔记(四)(VIEW)