首页 > 其他分享 >20230711 12. 本地方法

20230711 12. 本地方法

时间:2023-09-05 09:48:10浏览次数:41  
标签:12 Java 20230711 代码 v2ch12 本地 编写 HelloNative

本地方法

原则上说,“ 100% 纯 Java ” 的解决方案是非常好的,但有时你也会想要编写或使用其他语言的代码(这种代码通常称为 本地代码

特别是在 Java 的早期阶段,许多人都认为使用 C++ 来加速 Java 应用中关键部分是个好主意。但是,实际上,这基本上是徒劳的。Java 平台实现比网络 I/O 要快得多,而网络 I/O 是真正的瓶颈

求助于本地代码是有缺陷的。如果应用的某个部分是用其他语言编写的, 那么就必须为需要支持的每个平台都提供一个单独的本地类库。用 C 或 C++ 编写的代码没有对通过使用无效指针所造成的内存覆写提供任何保护。编写本地代码很容易破坏你的程序,并感染操作系统

建议只有在必需的时候才使用本地代码。特别是在以下 3 种情况下,也许应该使用本地代码:

  • 你的应用需要访问的系统特性和设备通过 Java 平台是无法实现的
  • 你已经有了大量的测试过和调试过的用另一种语言编写的代码,并且知道如何将其导出到所有的目标平台上
  • 通过基准测试,你发现所编写的 Java 代码比用其他语言编写的等价代码要慢得多

Java 平台有一个用于和本地 C 代码进行互操作的 API ,称为 Java 本地接口( JNI )

C++ 注意:你可以使用 C++ 代替 C 来编写本地方法。这样会有一些好处:类型检查会更严格一些,访问 JNI 函数会更便捷一些。然而,JNI 并不支持 Java 类和 C++ 类之间的任何映射机制

从 Java 程序中调用 C 函数

Java 编程语言使用关键字 native 表示本地方法

class HelloNative {
    public static native void greeting();
}

本地方法既可以是静态的也可以是非静态的

为了实现本地代码,需要编写一个相应的 C 函数,你必须完全按照 Java 虚拟机预期的那样来命名这个函数。其规则是:

  1. 使用完整的 Java 方法名,比如: HelloNative.greeting 。如果该类属于某个包,那么在前面添加包名,比如: v2ch12.helloNative.HelloNative.greeting
  2. 用下划线替换掉所有的句号,并加上 Java_ 前缀,例如, Java_v2ch12_helloNative_HelloNative_greeting
  3. 如果类名含有非 ASCII 字母或数字,如: _$ 或是大于 \u007F 的 Unicode 字符,用 _0xxxx 来替代它们, xxxx 是该字符的 Unicode 值的 4 个十六进制数序列
PS D:\Develop\workspace\study\study-corejava\src\main\java> javac v2ch12/helloNative/HelloNative.java
PS D:\Develop\workspace\study\study-corejava\src\main\java> javah v2ch12.helloNative.HelloNative

生成文件 D:\Develop\workspace\study\study-corejava\src\main\java\v2ch12_helloNative_HelloNative.h

将函数原型从头文件中复制到源文件中,并且给出函数的实现代码:

#include "HelloNative.h"
#include <stdio.h>

JNIEXPORT void JNICALL Java_v2ch12_helloNative_HelloNative_greeting(JNIEnv* env, jclass cl)
{  
   printf("Hello Native World!\n");
}

其他

标签:12,Java,20230711,代码,v2ch12,本地,编写,HelloNative
From: https://www.cnblogs.com/huangwenjie/p/17545039.html

相关文章

  • 20230619 Java核心技术(Java 17)(原书第12版)【归档】
    介绍版本Java版本:17说明关于图形相关的章节全部跳过,部分不常见不常用的也跳过书中内容有些确实全面,但是要注意也有些重要的部分没有涉及,例如NIO读书只是概览,掌握知识体系更进一步还要通过看代码深入掌握目录卷1基础知识1.Java程序设计概述2.Java编程环境3.......
  • 快充充电器5V-9V升压给12.6V三节串联锂电池充电芯片的方案IC
    随着USB Type-C快充PD的普及怎么从各种PD充电器取9V/12V/15V/20V给产品的锂离子电池供电呢?1.2应用:便捷充电设备等1.3 电池组:11.1V锂电池组,三串3.7V锂电池,充满12.6V1.4 输入电压:5V-9V (充电亮灯,充满转灯),充电电流:1.4A1.5芯片功能简介:1,锂电池充电芯片电路:FS5175AEFS5175AE支持1-4节......
  • 212 模拟科三
    下午去,晚上七点多回来模拟紧张,发挥不好,一次OK,一次不行(无缘无故变更车道没打转向灯),要记得灯光复位,不要发懵。记得考试流程,这个项目是什么,下个项目又是什么。不要紧张,明天考试好好发挥,一次过!......
  • 入门性文章要替新手多多考虑--csdn开发高手12期《利用Eclipse开发Hibernate应用程序》实
    注:本文使用Eclipse3.0.1(含中文包)测试,中英文请读者自行对应。  这篇文章总体写的不错,对于新手上路很有帮助。不过我在实践的时候也遇到了一些问题,在这里总结出来,希望大家少走弯路。1.Run的问题:“OK,Run一下”,作者仅提到这里,而对于新手,也许在这里就卡住了。怎么Run,Run什么啊?来,我......
  • homebrew安装软件出现git问题fatal: not in a git directory,Error: Command failed w
    homebrew安装软件出现git问题问题fatal:notinagitdirectoryError:Commandfailedwithexit128:git问题查找1.brew-v查看问题logsuyf@suyfdeMac-mini~%brew-vHomebrew4.0.18-18-g64259a4fatal:detecteddubiousownershipinrepositoryat'/op......
  • 泛微E-cology9 browser.jsp SQL注入漏洞QVD-2023-5012
    漏洞简介泛微e-cology9存在SQL注入漏洞,攻击者可利用该漏洞获取数据库敏感信息。影响版本泛微e-cologyV9<10.56漏洞复现fofa语法:app="泛微-协同商务系统"登录页面:POC:POST/mobile/%20/plugin/browser.jspHTTP/1.1Host:115.236.39.115:8088User-Agent:Mozilla/5.0(W......
  • 批量下载Markdown文件到本地
    批量下载Markdown文件到本地在Markdown文件中可能存在远程引用图片的情况,但是在某些情况下,我们处于无网环境,就可能造成Markdown查看异常1>[图片](https://cn.bing.com/images/search?q=%25E5%259B%25BE%25E7%2589%2587&FORM=IQFRBA&id=31F3A37194BC03C4AD16D80C327FF512......
  • 初三学生编写网页版 Windows 12
    初三学生编写网页版Windows12来源:OSCHINA编辑: 局2023-09-0316:13:00 7一名初三学生用前端开发三件套——HTML+CSS+JavaScript实现了一个网页版的Windows12。他表示在网上看到Windows12概念版(PoweredbyPowerPoint)后深受启发,因此决定做一个W......
  • LeetCode952三部曲之二:小幅度优化(137ms -> 122ms,超39% -> 超51%)
    欢迎访问我的GitHub这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos本篇概览本文是《LeetCode952三部曲》系列之二,在前文中,咱们详细分析了解题思路,然后按照思路写出了代码,在LeetCode提交成功,成绩如下图所示,137ms,超过39%不得不说这个成绩......
  • 那些年,这些年……2011.12.16
    那些年我还是小屁孩,那些年我什么都不懂,那些年学习只是件有点兴趣的事,从没有想过为什么要学习,那些年刚刚听的流行歌曲是老鼠爱大米和一千年以后,那些年对于感情什么都不懂,也许早点懂或许能骗骗小女孩什么的,那些年母亲管我很严格,那些我很瘦说真的,那些年似乎我很优秀,那些年第一次......