Jna与Jni调用C/C++效率比较

前言:       

       JNA是建立在JNI技术基础之上的一个Java类库,它使您可以方便地使用java直接访问动态链接库中的函数。原来使用JNI,你必须手工用C写一个动态链接库,在C语言中映射Java的数据类型。JNA中,它提供了一个动态的C语言编写的转发器,可以自动实现Java和C的数据类型映射。你不再需要编写C动态链接库。当然,这也意味着,使用JNA技术比使用JNI技术调用动态链接库会有些微的性能损失。可能速度会降低十几倍。就看你的需求来用了。
 

Jna:花时131ms如下图所示:

Jni:花时8ms如下图所示:

 总结:可见Jna调用C函数效率比jni低,但jna不用自己用c写一系列动态库等配置,用法比较简单。所以现在一般都使用jna调用c/c++函数。

可参考博客:https://blog.csdn.net/drifterj/article/details/7841810

附上jna java端代码:

import com.sun.jna.Library;
import com.sun.jna.Native;

import sun.security.jca.GetInstance.Instance;

public class TestJna {

	 public interface CLibrary extends Library {
	        CLibrary INSTANCE = (CLibrary)Native.loadLibrary("TestDll", CLibrary.class);
	 void testJnaTime();
	       // int add(int a, int b);
	    }
	 
	    public static void main(String[] args) {
	     //   int sum = CLibrary.INSTANCE.add(3, 6);
	// CLibrary.INSTANCE.testJnaTime();
	      //  System.out.println(sum);
	
	 long beginTime = System.currentTimeMillis();
		int i;int j;
		for(i=1;i<21;i++){
			for(j=i;j<51;j++){
				System.out.println(j);
				CLibrary.INSTANCE.testJnaTime();	
			}
		}
		long totalTime = System.currentTimeMillis()-beginTime;
		System.out.println("JNI AllTime(ms):"+totalTime);
	 
	    }

	
}

Jni  java端代码:

package cn.com.infosec.test;

public class TestJniTime {
	public native  void testTime();
	 public static void main(String[] args){
		 System.loadLibrary("TestJniTime");
		 TestJniTime t=new TestJniTime();
		 long beginTime = System.currentTimeMillis();
			int i;int j;
			for(i=1;i<51;i++){
				for(j=i;j<51;j++){
					System.out.println(j);
					 t.testTime();	
				}
			}
			long totalTime = System.currentTimeMillis()-beginTime;
			System.out.println("JNI AllTime(ms):"+totalTime);
	 }
}

 JniC端代码:

#include "TestJniTime.h"
#include "cn_com_infosec_test_TestJniTime.h"

JNIEXPORT void JNICALL Java_cn_com_infosec_test_TestJniTime_testTime
(JNIEnv *, jobject) {
	printf("hi jni \n");

}

(其余就不写的,百度上很多)

Jni教程推荐看博客:http://www.runoob.com/w3cnote/jni-getting-started-tutorials.html

不同的是:在生成.h文件时,我用的是以下方法:

javah -jni -classpath E:\eclipse.sts\Test\src  cn.com.infosec.test.TestJniTime

E:\eclipse.sts\Test\src这个路径是你的包所在的路径,后面的是全包名+class文件

Jni教程推荐看博客:

https://blog.csdn.net/gwd1154978352/article/details/55097376/

不同:在c代码处:
extern "C"_declspec(dllexport) int add(int a, int b);

直接复制以上博客的这个代码时候会报错,于是我把“C”右边的行线删了,自己写个下划线,就好了。如下:

extern "C" —declspec(dllexport) int add(int a, int b);

 

 

发布了57 篇原创文章 · 获赞 36 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/hqy1719239337/article/details/88966183