作者:zhattt199_117 | 来源:互联网 | 2023-12-11 14:53
本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。
本文目录一览:
1、浅谈如何用JNI的代码调用java接口
2、如何用JNI技术提高Java的性能详解
3、jni调用 java和c是同个线程吗
4、jni调用java的private方法
5、Java开发中什么情况下要用到JNI技术
6、用Java的JNI技术技术调用C++,C++运行效率会不会比单独运行时慢?
浅谈如何用JNI的代码调用java接口
对于本地函数
JNIEXPORT void JNICALL Java_video1_TestNative_sayHello(JNIEnv * env, jobject obj)
{
cout"Hello Native Test !"endl;
}
JNIEnv类型代表Java环境。通过这个JNIEnv*指针,就可以对Java端的代码进行操作。如,创建Java类得对象,调用Java对象的方法,获取Java对象的属性等。
JNIEnv的指针会被JNI传送到本地方法的实现函数中来对Java端的代码进行操作
JNIEnv类中的函数:
NewObject/NewString/NewTYPEArray :new新对象
Get/SetTYPEField:获取属性
Get/SetStaticTYPEField :获取静态属性
CallTYPEMethod/CallStaticTYPEMethod
如何用JNI技术提高Java的性能详解
阻碍Java取得广泛使用的一个首要因素是Java程序的运行效率。Java是介于解释型和编译型之间的一种语言,同样的程序,假如用编译型语言C来实现,其运行速度通常要比Java快一倍以上。Java具有平台无关性,这使人们在开发企业级使用的时刻总是把它作为首要候选方案之一,但是性能方面的因素又大大削弱了它的竞争力。为此,提高Java的性能就显得十分主要。 疑问的提出 Sun公司及Java的支撑者们为提高Java的运行速度已经做出了许多全力,其中大多数集中在程序设计的要领和模式挑选方面。由于算法和设计模式的优化是通用的,对Java有效的优化算法和设计模式,对其他编译语言也基本同样适用,因此无法从根本上改动 Java程序与编译型语言在执行效率方面的差别。 JIT(Just In Time,及时编译)技能是个比较好的思想。它的基本原理是:最先议决 Java编译器把Java源代码编译成平台无关的二进制字节码。然后在Java程序真实执行之前,系统议决 JIT编译器把Java的字节码编译为本地化机器码。结尾,系统执行本地化机器码,节省了对字节码实行解释的时间。这样做的优点是大大提高了Java程序的性能,缩短了加载程序的时间;同时,由于编译的结果并不在程序运行间保存,因此也节约了存储空间。缺点是由于JIT编译器对所有的代码都想优化,因此同样也占用了许多时间。 动态优化技能是提高Java性能的另一个尝试。该技能试图议决把Java源程序直接编译成机器码,以充分使用 Java动态编译和静态编译技能来提高Java的性能。该要领把输入的Java源码或字节码转换为经历高度优化的可执行代码和动态库 (Windows中的. dll文件或Unix中的. so文件)。该技能能大大提高程序的性能,但却破坏了Java的可移植性。 JNI技能 实际上,有一种通常为咱们忽视的技能能够在很大程度上处理这个难题,那就是JNI(Java Native Interface, Java本地化要领 )。主张采用纯Java的人们通常反对本地化代码的运用,他们认为在Java程序执行的流程中调用C/C++程序会影响程序的可移植性和安全性。还有一些人认为JNI只是对过去混合编程技能的基本扩展,本来际目标是为了充分使用大量原有的C程序库。 本来,咱们不必拘泥于严格的平台独立性限定,因为采用JNI技能只是针对一些严重影响Java性能的代码段,该部分可能只占源程序的极少部分,所以几乎能够不思虑该部分代码在主流平台之间移植的工作量。同时,也不必过分担心类型匹配疑问,咱们完全能够控制代码不出现这种不正确。此外,也不必担心安全控制疑问,因为Java安全模型已扩展为准许非系统类加载和调用本地点法。根据Java规范,从JDK 1. 2开始,FindClass将设法找到与当前的本地点法关联的类加载器。假如平台有关代码属于一个系统类,则无需涉及任何类加载器; 否则,将调用适当的类加载器来加载和链接已命名的类。换句话说,假如在Java程序中直接调用C/C++语言产生的机器码,该部分代码的安全性就由Java虚拟机控制。
jni调用 java和c是同个线程吗
是的,jni调用时, java和c是同个线程。
检测方法:在java和c中分别把当前线程的id输出出来查看。
Java获取线程Id:
Thread.currentThread().getId();
C中获取线程Id:
GetCurrentThreadId();
jni调用java的private方法
jni调用java的public native修饰的方法
可以把调用jni的方法和要访问的private方法,封装到一个方法里,触发事件时,其实是实用这个封装好的方法。
Java开发中什么情况下要用到JNI技术
JNI可以使Java代码和本地的C/C++代码进行交互。
为什么要使用JNI技术:
java无法直接操作硬件, c/c++可以操作硬件,并且效率较高。
java在视频处理,游戏渲染等方面效率不及c/c++。
避免重复造轮子, 有大量优秀的库,可以复用。
例如:java图形界面程序在最小化后,无法获取全局的键盘和鼠标事件. 需要JNI实现全局热键功能 . java里获取其他窗口的句柄, 并对其他窗口进行控制,也需要JNI技术.
使用了JNI技术缺点是会导致无法跨平台。 需要根据其他平台,再开发本地代码。
JNI实现起来有点复杂. 所以有了JNA技术, 虽然JNA很强大,但是很多功能还是需要JNI来实现的
用Java的JNI技术技术调用C++,C++运行效率会不会比单独运行时慢?
这要取决于在方法中执行的语句,如果只是作一些简的操作,调用C/C++代码反而会拉低效率,如果是比较复杂的一些运算如图像处理变换等,C/C++代码效率更高。
java中引入jni技术的原由是由于java的运行效率较低,当遇到处理图像声音等需要大量运算的操作时,java力不从心。所以引入执行效率较高的C/C++代码供java调用,以弥补java的这一缺陷。
jni虽然一定程度上能够提高效率,但要慎用,适当用。如果只作简单的加法,却用jni效率反而大大降低。并且jni会影响java的跨平台性和稳定性。