Jna与Jni调用C/C++效率比较
前言:
NA是建立在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.****.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.****.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);