返回顶部
首页 > 资讯 > 精选 >如何通过JNI本地编写来解决Java无法编写大问题
  • 126
分享到

如何通过JNI本地编写来解决Java无法编写大问题

2023-06-17 15:06:01 126人浏览 薄情痞子
摘要

本篇文章为大家展示了如何通过JNI本地编写来解决Java无法编写大问题,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。在您的程序中使用JNI并不是一件容易的事情,然而,JNI的性能和使用原有代码的能力

本篇文章为大家展示了如何通过JNI本地编写来解决Java无法编写大问题,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

在您的程序中使用JNI并不是一件容易的事情,然而,JNI的性能和使用原有代码的能力将会为您的Java程序添加更多的功能并且能胜任更多的挑战。

Java本地接口(JNI——Java Native Interface)允许运行在Java虚拟机(JVM——Java Virtual Machine)上的代码调用本地程序和类库,或者被它们调用,这些程序和类库可以是其它语言编写的,比如C、c++或者汇编语言。当一个程序无法完全使用Java编写时,开发者可以通过JNI来编写本地方法,比如标准Java类库并不支持的依赖于平台的特色或者程序库。JNI还可以用于修改现有的使用其它语言编写的程序,使它们可以通过Java编写的程序来访问。很多基本类库都依赖JNI来为开发者和用户提供服务,比如文件的输入/输出和音频功能。在基本类库中包含的对于性能和平台敏感的api可以允许所有的Java程序以安全和平台无关的方式来使用这些功能,在采用JNI之前,开发者需要明确这些功能并不是已经包含在Java标准类库中的,在这篇文章中,我将会讲解JNI是如何工作的以及本地类型是如何映射到Java的类型和类库的。

JNI工作原理

在JNI中,本地函数是通过一个独立的.c或.cpp文件来实现的(C++为JNI提供的界面会更简洁一些)。当JVM调用该函数时,它传递了一个JNIEnv指针、一个jobject指针和通过Java方法定义的Java参数,JNI函数的形式如下:

 JNIEXPORT void JNICALL   Java_ClassName_MethodName  (JNIEnv *env, jobjectobj)   {   //Method native implemenation  }

env指针是一个包含了JVM接口的结构,它包含了与JVM进行交互以及与Java对象协同工作所必需的函数,示例中的JNI函数可以在本地数组和Java数组类型之间、本地字符串和Java字符串类型之间进行转换,其功能还包括对象的实例化、抛出异常等。基本上您可以使用JNIEnv来实现所有Java能做到的事情,虽然要简单很多。更加正式的解释是这样的,本地代码通过调用JNI的函数来访问JVM,这是通过一个界面指针实现的(界面指针实际上是指向指针的指针),该指针指向一个指针数组,数组中的每个指针都指向了一个界面函数,而每个界面函数都是在数组中预先定义过的。本地方法将JNI界面指针当作一个参数,如果在同一个Java线程中,出现对该本地方法的多重调用,JVM则保证传递相同的界面指针到本地方法。不过,一个本地方法可以被不同的Java线程调用,因而也可能会收到不同的JNI界面指针。

本地方法是通过System.loadLibrary方法加载的,在以下的例子中,类的初始化方法加载了一个指定平台的本地类库,该类库定义了本地方法:

 packagepkg;    class Cls   {   native double f(inti, String s);   static   {    System.loadLibrary(pkg_Cls");   }   }

System.loadLibrary方法的参数是一个类库的名称,它可以由程序员任意选取,系统则遵循一个标准的本地化平台的方式来转换类库的名称到一个本地类库的名称。例如,在Solaris操作系统中会将pkg_Cls转换为libpkg_Cls.so,而Win32系统则会将同样的pkg_Cls转换为pkg_Cls.dll。

动态指针会根据它们的名字来进行解析,一个本地方法的名称是按照组件进行连接的,它包含了:前缀“Java_”、一个分离的合法的类名称和一个分离的方法名称。注意:微软的JVM有相同的机制从Java调用本地windows代码,该机制被称为原始本地接口(Raw Native Interface (RNI))。基本类型,比如整型、字符等等,是在Java和本地代码间进行拷贝的,而其他的自定义Java对象则是通过引用来传递的。这个表格展示了Java和本地代码之间的类型映射,这些类型是可以互换的,您可以在您使用int类型的位置使用jint类型,当然反过来也一样,而且不需要任何类型转化。但是,Java的字符串和数组类型和本地的字符串与数组类型之间的转换就比较困难了,如果您使用的jstring类型中出现了字符“*”,您的代码会造成JVM的崩溃,以下的例子说明了您应当如何正确使用字符串:

 JNIEXPORT void JNICALL   Java_ClassName_MethodName   (JNIEnv *env, jobjectobj, jstringjavaString)   {    //Get the native string from   Java string  const char   *nativeString =   env->GetStringUTFChars(env,javaString, 0);   printf("%s", nativeString);    env->ReleaseStringUTFChars(env,javaString, nativeString);   }

您需要使用界面指针env来操作Java对象。

上述内容就是如何通过JNI本地编写来解决Java无法编写大问题,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网精选频道。

--结束END--

本文标题: 如何通过JNI本地编写来解决Java无法编写大问题

本文链接: https://lsjlt.com/news/290113.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何通过JNI本地编写来解决Java无法编写大问题
    本篇文章为大家展示了如何通过JNI本地编写来解决Java无法编写大问题,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。在您的程序中使用JNI并不是一件容易的事情,然而,JNI的性能和使用原有代码的能力...
    99+
    2023-06-17
  • 如何编写Python程序来解决编程算法问题?学习笔记分享!
    Python是一种被广泛应用于各个领域的编程语言。在算法领域,Python也有着广泛的应用。本文将分享如何编写Python程序来解决编程算法问题,并给出一些学习笔记和实际演示代码。 一、Python编程基础 Python是一种易于学习的编程...
    99+
    2023-06-23
    编程算法 学习笔记 load
  • 如何在leetcode上使用Python编写更快的算法来解决大数据问题?
    当我们在LeetCode上解决算法问题时,我们通常会遇到一些大数据集的测试用例。这些大数据集可能会导致我们的算法运行缓慢,甚至超时。因此,编写更快的算法是非常关键的。在本文中,我们将探讨如何使用Python编写更快的算法来解决大数据问题。 ...
    99+
    2023-09-24
    leetcode 大数据 打包
  • ARM汇编如何解决阶乘及大小写转换的问题
    本篇文章为大家展示了ARM汇编如何解决阶乘及大小写转换的问题,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。环境以及硬件一、硬件仿真基于 SAMSUNG's S3C44B0X 16/32-bi...
    99+
    2023-06-25
  • 如何解决编写代码时出现的Go问题
    这篇文章主要介绍“如何解决编写代码时出现的Go问题”,在日常操作中,相信很多人在如何解决编写代码时出现的Go问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何解决编写代码时出现的Go问题”的疑惑有所帮助!...
    99+
    2023-06-15
  • 如何解决Mac无法写入U盘的问题
    这期内容当中小编将会给大家带来有关如何解决Mac无法写入U盘的问题,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。为了让Mac支持读写ntfs硬盘,许多人都会花钱购买第三方软件。这类软件不仅价格高,还相当不...
    99+
    2023-06-05
  • ubuntu中如何解决php无法编译问题
    小编给大家分享一下ubuntu中如何解决php无法编译问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!ubuntu的php无法编译的解决办法:1、执行“apt-...
    99+
    2023-06-22
  • 使用Go编写API和HTTP:如何解决常见的算法问题?
    在Web开发中,API和HTTP是必不可少的组件。Go语言在这个领域中变得越来越受欢迎,因为它具有快速、可靠和易于编写的特性。本文将介绍如何使用Go编写API和HTTP,并解决常见的算法问题。 一、API和HTTP API是应用程序编程接...
    99+
    2023-07-23
    编程算法 api http
  • Ubuntu无法安装vim文本编辑器的问题如何解决
    这篇文章主要介绍“Ubuntu无法安装vim文本编辑器的问题如何解决”,在日常操作中,相信很多人在Ubuntu无法安装vim文本编辑器的问题如何解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Ubuntu无...
    99+
    2023-06-13
  • 如何解决Vue编译时写在style中的路径问题
    这篇文章将为大家详细讲解有关如何解决Vue编译时写在style中的路径问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。写在vue文件里面的style样式,在添加例如背景...
    99+
    2024-04-02
  • 如何使用Javascript编程来解决大数据处理问题?
    随着数据的不断增加,数据处理已经成为了许多企业和组织面临的一个重大挑战。为了处理庞大的数据集,需要使用一种高效的编程语言和工具来加速数据分析和处理。Javascript是一种流行的编程语言,可以用于处理大型数据集。在本文中,我们将探讨如何...
    99+
    2023-11-11
    编程算法 大数据 javascript
  • Java Spring编程中如何选择最优的算法来解决问题?
    在Java Spring编程中,算法的选择对于解决问题的效率和准确性至关重要。因此,在编写代码时,我们需要考虑多种因素,如数据的规模、复杂度、时间和空间复杂度等。本文将探讨如何选择最优的算法来解决Java Spring编程中的问题。 一、...
    99+
    2023-06-07
    spring 编程算法 shell
  • Android编程中TextView宽度过大导致Drawable无法居中问题解决方法
    本文实例讲述了Android编程中TextView宽度过大导致Drawable无法居中问题解决方法。分享给大家供大家参考,具体如下: 在做项目的时候,很多时候我们都要用到文字和...
    99+
    2022-06-06
    方法 居中 Android
  • 如何解决本地mysql服务无法启动的问题
    小编给大家分享一下如何解决本地mysql服务无法启动的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!本地mysql服务无法启...
    99+
    2024-04-02
  • 能否通过编程算法解决Windows下Java程序的Load速度问题?
    Java是一种非常流行的编程语言,但是在Windows操作系统下,Java程序的Load速度经常会成为开发者的烦恼。那么,我们能否通过编程算法来解决这个问题呢? 首先,我们需要了解Windows操作系统下Java程序的Load过程。在Win...
    99+
    2023-10-27
    load 编程算法 windows
  • 编程算法:如何使用Python和Bash来解决复杂问题?
    编程算法是计算机科学中非常重要的一个领域,它涉及到如何使用编程语言解决复杂问题。Python和Bash是两种非常强大的编程语言,它们可以用来解决各种各样的问题。在本文中,我们将介绍如何使用Python和Bash来解决复杂问题,并且演示一些...
    99+
    2023-06-24
    bash 编程算法 编程算法
  • IDE 中的 Java 同步问题:如何有效地解决并发编程难题?
    Java 是一门广泛使用的编程语言,其强大的并发编程能力使得它在大规模应用程序中得到了广泛的应用。然而,Java 中的并发编程也面临着一些挑战,其中之一就是同步问题。在本文中,我们将探讨 Java 中的同步问题以及如何有效地解决这些问题。 ...
    99+
    2023-06-26
    同步 ide http
  • 如何在 Python 中使用 leetcode 上的算法来解决编程问题?
    Python 是一种很流行的编程语言,而 leetcode 是一个知名的算法题库网站。在 Python 中,我们可以使用 leetcode 上的算法来解决编程问题。在本文中,我将为大家分享如何在 Python 中使用 leetcode 上的...
    99+
    2023-07-23
    编程算法 leetcode 文件
  • 如何在 Python 编程中利用算法来解决复杂的问题?
    Python 是一种广泛使用的编程语言,具有简单易学、可读性强、功能强大、支持多种编程范式等优点。在 Python 编程中,我们经常需要解决一些复杂的问题,例如排序、查找、最短路径等。这时候,我们可以利用算法来解决这些问题。 本文将介绍一些...
    99+
    2023-07-23
    编程算法 日志 unix
  • 如何解决mysql的bin-log导致/var目录过大无法启动问题
    这期内容当中小编将会给大家带来有关如何解决mysql的bin-log导致/var目录过大无法启动问题,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。今天在重启mysql时发...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作