热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何用JNI技术调用Java接口以及提高Java性能的详解

本文介绍了如何使用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的跨平台性和稳定性。


推荐阅读
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • JavaScript 基础语法指南
    本文详细介绍了 JavaScript 的基础语法,包括变量、数据类型、运算符、语句和函数等内容,旨在为初学者提供全面的入门指导。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 在前两篇文章中,我们探讨了 ControllerDescriptor 和 ActionDescriptor 这两个描述对象,分别对应控制器和操作方法。本文将基于 MVC3 源码进一步分析 ParameterDescriptor,即用于描述 Action 方法参数的对象,并详细介绍其工作原理。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • This request pertains to exporting the hosted_zone_id attribute associated with the aws_rds_cluster resource in Terraform configurations. The absence of this attribute can lead to issues when integrating DNS records with Route 53. ... [详细]
  • 如何使用Ping命令来测试网络连接?当网卡安装和有关参数配置完成后,可以使用ping命令来测试一下网络是否连接成功。以winXP为例1、打开XP下DOS窗口具体操作是点击“开始”菜 ... [详细]
author-avatar
zhattt199_117
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有