-
为什么C++通过JNI调用JAVA类函数速度慢近十倍?10
很不解,多谢了。实在对不住,积分所剩不多。
问题补充:兄台误会我意思了,主要我没说清楚。我是指Java类中的某个函数的执行时间在C++中通过JNI方式调用执行要比通过Java传统方式执行要慢很多。
wkfighting 写道理论上用native方法比普通的Java方法运行效率要高一些。Java程序的运行时通过虚拟机来进行的,虽说提供了可移植性,但运行效率也比直接的可执行文件要低,因为多了很多不必要的中间过程。JNI是直接调用由C或C++生成的动态函数库,所以执行起来要快很多。
问题补充:
我指的是Java类中的某个函数(也即相同的JAVA代码)的执行时间在C++中通过JNI方式调用执行要比通过Java传统方式执行要慢很多。
redstarofsleep 写道LZ,你的代码是什么样的呢?
你的意思是不是说相同的代码,用Java写和用C++写,但是Java运行的效率要高于Java调用C++??
问题补充:我说的C++中调用Java类方法的执行时间是剔除了装载jvm.dll和创建JavaVM实例的时耗,且时间打印是在Java代码中的。
kidding87 写道他说的是c++来调用java的类方法
慢才正常啊,java的类都是基于jvm的,首先要有jvm,才能去调用java方法
而jvm又基于操作系统
他们就这样绕啊绕的,肯定慢了
问题补充://JVM启动参数 options[0].optionString = Compiler; //类地址 options[1].optionString = ClassPath; //lib地址 options[2].optionString = LibraryPath; //最小内存 options[3].optionString = MinMB; //最大内存 options[4].optionString = MaxMB; //此处省略装载jvm.dll,创建JavaVM及查找Java类等过程 //取得入口主函数序列号 jmethodID mid = env->GetStaticMethodID(cls, MainName, "([Ljava/lang/String;)V"); if (mid == 0) { return -1; } //main启动 env->CallStaticVoidMethod(clazz, mid, NULL);
以上代码为我在C++程序中调用Java类的主函数main的过程,其中时间打印是在Java类的main函数中。
得到的结果是:通过这种方式执行后的打印的时间要比通过传统方式(即由java.exe来装载Java类)慢近十倍。
redstarofsleep 写道你是什么样的代码呢?
能再说具体一点吗?
JVM本身也有优化的啊
问题补充:好的,谢谢了
kidding87 写道建议你在论坛问问他
RednaxelaFX
问题补充:第二次调用执行时间的确有提升,但还是远远慢于直接的java.exe启动执行。
chen_yongkai 写道将java类中的方法执行两次,估计第二次时间就正常了。我猜测是Java类的延迟装载造成第一次调用慢了,你可以试试看,不知道我猜测的对不对?
2012年3月07日 17:10
6个答案 按时间排序 按投票排序
-
将java类中的方法执行两次,估计第二次时间就正常了。我猜测是Java类的延迟装载造成第一次调用慢了,你可以试试看,不知道我猜测的对不对?
2012年3月08日 15:02
-
他说的是c++来调用java的类方法
慢才正常啊,java的类都是基于jvm的,首先要有jvm,才能去调用java方法
而jvm又基于操作系统
他们就这样绕啊绕的,肯定慢了2012年3月08日 08:13
-
LZ,你的代码是什么样的呢?
你的意思是不是说相同的代码,用Java写和用C++写,但是Java运行的效率要高于Java调用C++??2012年3月07日 22:21
-
理论上用native方法比普通的Java方法运行效率要高一些。Java程序的运行时通过虚拟机来进行的,虽说提供了可移植性,但运行效率也比直接的可执行文件要低,因为多了很多不必要的中间过程。JNI是直接调用由C或C++生成的动态函数库,所以执行起来要快很多。
2012年3月07日 18:43
相关推荐
在本文中,我们将深入探讨如何在Visual Studio 2019环境下使用C++通过Java Native Interface (JNI)来调用Java代码。JNI是Java平台的一部分,它为Java应用程序提供了与本地代码交互的能力,使得开发者可以将Java应用...
总结来说,Delphi 10.3通过JNI调用Java函数的过程涉及以下步骤: 1. 创建C++ DLL项目,引入JNI头文件。 2. 定义JNI函数,实现Delphi和Java之间的交互逻辑。 3. 在Delphi程序中加载DLL,获取JNI函数的指针。 4. 使用...
在提供的资源"使用C++创建java虚拟机JVM,使用JNI调用java函数"中,可能详细介绍了以上步骤的实际应用,包括代码示例和可能遇到的问题及解决方案。通过学习和实践这个教程,开发者可以更好地理解和掌握C++与Java之间...
Java程序可以通过JNI调用本地方法,这些本地方法是用其他语言编写的,并通过JNI接口暴露给Java。这个过程涉及到以下几个步骤: 1. **创建本地方法声明**:在Java类中,你需要声明本地方法。这些方法没有具体实现,...
编译并运行`Main`类,Java就会通过JNI调用到C++的`callCppFunction`函数。 总结起来,JNI调用C++代码的过程包括:在Java中声明本地方法、生成JNI头文件、编写C++实现、编译C++代码为动态链接库,以及在Java程序中...
总的来说,Delphi通过JNI调用Java函数是一种灵活且强大的技术,它允许Delphi开发者充分利用Java库,同时保持Delphi的高效性能。在实际项目中,这种技术常用于混合开发,如利用Java的网络通信库、大数据处理库等,与...
Java通过JNI调用C# DLL是一个跨平台、跨语言的技术实践,主要应用于需要利用Java的稳定性和C#的高性能场景。JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。C# ...
7. **Java调用C++**:同样,Java代码也可以通过JNI调用C++函数。只需声明对应的`native`方法,然后在C++中实现。 总的来说,C++通过JNI与Java的相互调用在Cocos2dx 3.3中是一个关键的集成技术,它使得开发者能够...
Java 通过 JNI 调用 C++ 的 DLL 文件 JNI(Java Native Interface)是一种允许 Java 代码和本地应用程序交互的技术。通过 JNI,Java 应用程序可以调用本地库,反之亦然。本文将详细介绍如何使用 JNI 将 Java 应用...
通过以上步骤,我们可以实现C++通过JNI调用Java类的功能。这个过程涉及到了Java和C++的混合编程,需要对两种语言有深入的理解,并且熟悉JNI提供的接口。在实际应用中,开发者还需要考虑多线程、内存管理、错误处理等...
3. **编写C++代码**:实现JNI头文件中定义的函数,这些函数会通过JNI接口调用Java函数。`FunCall_C2Java_Caller`可能是这部分的源代码。 4. **链接JNI库**:C++代码需要链接到JNI库,以便能够调用JNI提供的API。 5. ...
本资料"Java通过JNI调用C语言函数库的方法.zip"提供了一个名为"JavaJNIStudy-master"的项目,下面将详细介绍这一过程的关键知识点。 1. **JNI简介** JNI是Java平台的标准接口,它使得Java应用程序可以与本地代码...
通过以上步骤,你就成功地在Visual Studio 2019的C++环境中,使用JNI调用了Java代码。这个过程涵盖了Java和C++之间的接口设计、头文件生成、C++代码编写、库编译以及Java程序的运行。理解并掌握这些步骤,对于进行跨...
利用JNI技术实现Java中调用C++编写的函数库示例程序源码,并附上参考JNI文档。...详情见本人博客:Java学习之通过JNI调用C/C++编写的dll链接库(图文教程)(http://write.blog.csdn.net/postlist)
- JNI接口提供了Java虚拟机(JVM)和本地代码之间的桥梁,使得开发者可以使用Java调用C/C++函数,反之亦然。 - JNI头文件(`jni.h`)包含了定义了JNI函数和数据类型的声明,是编写JNI代码的基础。 2. **创建JNI...
在Java中,通过JNI接口,开发者可以定义native方法,并在C或C++代码中实现这些方法,以便调用DLL中的函数。这涉及到以下步骤: 1. 在Java类中声明native方法。 2. 使用javah工具生成C/C++头文件,该文件定义了JNI...
在本主题中,我们将深入探讨如何使用C++通过JNI来调用Java中的方法,以及如何实现C++与JavaScript的互调。这在跨平台开发、性能优化或利用现有C/C++库时尤其有用。 首先,我们需要理解JNI的基本结构。JNI接口定义了...
在这个DEMO中,我们看到有get()和set()两个方法,这些都是通过JNI调用C/C++实现的。在Java中,这些方法会声明为native,并且没有具体的实现。然后,使用`javah`工具,根据Java类生成相应的C/C++头文件。在C/C++代码...
通过 JNI 提供的 `FindClass` 和 `GetMethodID` 函数,你可以找到并获取要调用的 Java 类和方法。接着,使用 `CallXXXMethod` 系列函数(如 `CallVoidMethod`, `CallIntMethod` 等)执行实际的函数调用。 5. **...
在Java编程环境中,有时我们需要利用C或C++的高性能特性,这时可以借助Java Native Interface (JNI) 进行Java和C++之间的交互调用。JNI允许Java代码调用本地(非Java)代码,并且反之亦然。下面我们将详细介绍如何用...