【JVM之内存与垃圾回收篇】本地方法接口
本地方法接口
什么是本地方法
简单地讲,一个 Native Method 是一个 Java 调用非 Java 代码的接囗。一个 Native Method 是这样一个 Java 方法:该方法的实现由非 Java 语言实现,比如 C。这个特征并非 Java 所特有,很多其它的编程语言都有这一机制,比如在 C++ 中,你可以用 extern "c" 告知 C++ 编译器去调用一个 C 的函数。
"A native method is a Java method whose implementation is provided by non-java code."(本地方法是一个非 Java 的方法,它的具体实现是非 Java 代码的实现)
在定义一个 native method 时,并不提供实现体(有些像定义一个 Java interface),因为其实现体是由非 java 语言在外面实现的。
本地接口的作用是融合不同的编程语言为 Java 所用,它的初衷是融合 C/C++ 程序。
代码举例说明 Native 方法是如何编写的
/**
* 本地方法
*
* @author: Nemo
*/
public class IhaveNatives {
public native void Native1(int x);
native static public long Native2();
native synchronized private float Native3(Object o);
native void Natives(int[] ary) throws Exception;
}
需要注意的是:标识符native可以与其它java标识符连用,但是abstract除外
为什么使用 Native Method?
Java 使用起来非常方便,然而有些层次的任务用 Java 实现起来不容易,或者我们对程序的效率很在意时,问题就来了。
与 Java 环境的交互
有时 Java 应用需要与 Java 外面的环境交互,这是本地方法存在的主要原因。你可以想想 Java 需要与一些底层系统,如操作系统或某些硬件交换信息时的情况。本地方法正是这样一种交流机制:它为我们提供了一个非常简洁的接口,而且我们无需去了解 Java 应用之外的繁琐的细节。
与操作系统的交互
JVM 支持着 Java 语言本身和运行时库,它是 Java 程序赖以生存的平台,它由一个解释器(解释字节码)和一些连接到本地代码的库组成。然而不管怎样,它毕竟不是一个完整的系统,它经常依赖于一底层系统的支持。这些底层系统常常是强大的操作系统。通过使用本地方法,我们得以用 Java 实现了 jre 的与底层系统的交互,甚至 JVM 的一些部分就是用 C 写的。还有,如果我们要使用一些 Java 语言本身没有提供封装的操作系统的特性时,我们也需要使用本地方法。
Sun's Java
Sun 的解释器是用 C 实现的,这使得它能像一些普通的 C 一样与外部交互。jre 大部分是用 Java 实现的,它也通过一些本地方法与外界交互。例如:类 java.lang.Thread 的 setPriority()
方法是用 Java 实现的,但是它实现调用的是该类里的本地方法 setPriority()
。这个本地方法是用 C 实现的,并被植入 JVM 内部,在 Windows 95 的平台上,这个本地方法最终将调用 Win32 setPriority() API。这是一个本地方法的具体实现由 JVM 直接提供,更多的情况是本地方法由外部的动态链接库(external dynamic link library)提供,然后被 JVW 调用。
注意:标识符 native 可以与所有其他的 Java 标识符连用,但是 abstract 除外。
现状
目前该方法使用的越来越少了,除非是与硬件有关的应用,比如通过 Java 程序驱动打印机或者 Java 系统管理生产设备,在企业级应用中已经比较少见。因为现在的异构领域间的通信很发达,比如可以使用 Socket 通信,也可以使用 Web Service 等等,不多做介绍。
Java如何调用C语言程序,JNI技术
Java为什么要调用C语言编写的程序
因为涉及操作系统底层的事件,Java是处理不了的,例如用户上传一个视频文件,需要后台给视频加上水印,或者后台分离视频流和音频流,这个事Java就做不了,只能交给C语言去处理,然后Java调用C语言的接口。
使用Java如何去调用C语言的接口呢?
使用Java的JNI技术。
具体调用步骤
CentOS7环境下
首先创建Java文件 HelloJni.java ,并创建native方法
package com.hongyu.jni;
public class HelloMyJni{
public native void helloWorld(); // 注意,这个native方法就是调用C语言接口用的
static{
System.loadLibrary("hello"); // 这行是调用动态链接库
}
public static void main(String[] args){
new HelloMyJni().helloWorld();
}
}
编译Java文件并生成java头文件
javac -d . HelloJni.java // 生成class文件
javah -jni com.hongyu.jni.HelloJni // 生成java头文件 com_hongyu_jni_HelloJni.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_hongyu_jni_HelloJni */
#ifndef _Included_com_hongyu_jni_HelloJni
#define _Included_com_hongyu_jni_HelloJni
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_hongyu_jni_HelloJni
* Method: helloWorld
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_hongyu_jni_HelloJni_helloWorld
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
创建C语言文件,HelloWorld.c
#include "jni.h"
#include "com_hongyu_jni_HelloJni.h"
#include <stdio.h>
#include <stdlib.h>
JNIEXPORT void JNICALL Java_com_hongyu_jni_HelloJni_helloWorld(JNIEnv * env, jobject obj)
{
printf("Hello World!\n");
}
生成动态链接库文件 libhello.so
#gcc -Wall -fPIC -c HelloWorld.c -I ./ -I $JAVA_HOME/include/linux/ -I $JAVA_HOME/include/
#gcc -Wall -rdynamic -shared -o libhello.so HelloWorld.o
设置动态链接库文件的目录
打开文件
vi ~/.bash_profile
修改文件:
export JAVA_HOME=/home/jdk1.8.0_161
export PATH=$JAVA_HOME/bin:$PATH
export LD_LIBRARY_PATH=/home/lib:$LD_LIBRARY_PATH
刷新文件:
source ~/.bash_profile
把刚才生成的so文件拷贝到/home/lib下,然后执行class文件
java com.hongyu.jni.HelloJni
大功告成!Java成功调用了C语言编写的逻辑
【JVM之内存与垃圾回收篇】本地方法接口的更多相关文章
- 【JVM之内存与垃圾回收篇】方法区
方法区 前言 这次所讲述的是运行时数据区的最后一个部分 从线程共享与否的角度来看 ThreadLocal:如何保证多个线程在并发环境下的安全性?典型应用就是数据库连接管理,以及会话管理 栈.堆.方法区 ...
- 【JVM之内存与垃圾回收篇】虚拟机栈
虚拟机栈 虚拟机栈概述 由于跨平台性的设计,Java 的指令都是根据栈来设计的.不同平台 CPU 架构不同,所以不能设计为基于寄存器的. 优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同 ...
- 【JVM之内存与垃圾回收篇】JVM与Java体系结构
JVM与Java体系结构 前言 作为Java工程师的你曾被伤害过吗?你是否也遇到过这些问题? 运行着的线上系统突然卡死,系统无法访问,甚至直接OOMM! 想解决线上JVM GC问题,但却无从下手. 新 ...
- 【JVM之内存与垃圾回收篇】运行时数据区概述及线程
运行时数据区概述及线程 前言 本节主要讲的是运行时数据区,也就是下图这部分,它是在类加载完成后的阶段 当我们通过前面的:类的加载-> 验证 -> 准备 -> 解析 -> 初始化 ...
- 【JVM之内存与垃圾回收篇】堆
堆 堆的核心概念 堆针对一个 JVM 进程来说是唯一的,也就是一个进程只有一个 JVM,但是进程包含多个线程,他们是共享同一堆空间的. 一个 JVM 实例只存在一个堆内存,堆也是 Java 内存管理的 ...
- 【JVM之内存与垃圾回收篇】对象实例化内存布局与访问定位
对象实例化内存布局与访问定位 从各自具体的内存分配上来讲 new 的对象放在堆中 对象所属的类型信息是放在方法区的 方法当中的局部变量放在栈空间 这 new 的对象怎么把三块粘合到一起 就是这章的内容 ...
- 【JVM之内存与垃圾回收篇】StringTable
StringTable String的基本特性 String:字符串,使用一对 "" 引起来表示 String s1 = "Nemo"; // 字面量的定义方式 ...
- 【JVM之内存与垃圾回收篇】类加载子系统
类加载子系统 概述 完整图如下: 如果自己想手写一个 Java 虚拟机的话,主要考虑哪些结构呢? 类加载器 执行引擎 类加载器子系统作用 类加载器子系统负责从文件系统或者网络中加载 Class 文件, ...
- 【JVM之内存与垃圾回收篇】执行引擎
执行引擎 执行引擎概述 执行引擎属于 JVM 的下层,里面包括 解释器.及时编译器.垃圾回收器 执行引擎是 Java 虚拟机核心的组成部分之一. "虚拟机"是一个相对于" ...
- 【JVM之内存与垃圾回收篇】程序计数器
程序计数器 介绍 JVM 中的程序计数寄存器(Program Counter Register)中,Register 的命名源于 CPU 的寄存器,寄存器存储指令相关的现场信息.CPU 只有把数据装载 ...
随机推荐
- 一站式解决方案 :OFD电子证照生成
前言 证照的电子化是一个趋势:可以预计,未来几年内,绝大部分证照都会电子化.电子证照的种类越来越多,应用场景也复杂多样:这就给电子证照规范的制定.电子证照的生成提出了更高的要求.电子证照采用的格式有两 ...
- html页面滚动时元素错位解决方案
一个布局较复杂的页面,在手机浏览器上运行时,部分配置比较差的手机会出现滚动滚动条后,页面正常滚动,但部分元素却出现类似position:fixed一般悬浮在页面上,然后再滚动.看上去有点像视差滚动,但 ...
- 从Linux零拷贝深入了解I/O
转载&学习文章:从Linux零拷贝深入了解I/O 本文将从文件传输场景以及零拷贝技术深究 Linux I/O 的发展过程.优化手段以及实际应用. 前言 存储器是计算机的核心部件之一,在完全理想 ...
- Sdcb Chats 技术博客:数据库 ID 选型的曲折之路 - 从 Guid 到自增 ID,再到 Guid
Sdcb Chats 技术博客:数据库 ID 选型的曲折之路 - 从 Guid 到自增 ID,再到 Guid 在软件开发中,数据库主键的选择,Guid 还是自增整数 ID,一直是一个备受开发者关注和讨 ...
- flutter如何搭建android环境
1.电脑上按安装sdk 首先配置Java的JDK 配好后,输入java 出现内容说明安装成功 然后在输入javac 出现内容说明jre安装成功 2.电脑上安装android Studio 安卓下载地址 ...
- 【忍者算法】从股市走势到动态规划:探索最大子数组和问题|LeetCode 53 最大子数组和
从股市走势到动态规划:探索最大子数组和问题 生活中的算法 想象你是一位股票交易员,手上有一支股票的每日涨跌数据.你想找出哪段连续的交易日能获得最大的收益.如果某天股票上涨5元,我们记为+5,下跌3元记 ...
- 构建强大算力基础,奠定AI时代基石!
7月6日,2023世界人工智能大会在上海拉开序幕.由中国电信主办的"算网一体 融创未来"主题论坛也于当日在上海世博中心举行.上海市经济和信息化委员会副主任戎之勤.上海市金山区人民政 ...
- C#中使用正则将字符串中某字符不区分大小写并按全字匹配替换为空
具体代码如下所示: //将字符串中desc不区分大小写并按全字匹配替换为空 var strText = "CreatDeSce DeSc,UserName AsC"; string ...
- git pull报错:Pulling without specifying how to reconcile divergent branches is discouraged.
一.保存内容如下 二.翻译 三.设置为默认即可:git config pull.rebase false
- 德承GP-3100 x DeepSeek:边缘运算工控机在Windows系统下私有化部署DeepSeek-R1 AI模型教程
2025年春节前夕,中国人工智能企业深度求索(DeepSeek)发布其开源AI模型DeepSeek-R1,性能对标OpenAI开发的GPT-o1正式版,一时之间各类相关的话题引爆国内外.除了可以在手机 ...