深入探讨Java的native方法与JNI

Android深入理解JNI(一)JNI原理与静态、动态注册 JNI不仅仅在NDK开发中应用,它更是Android系统中Java与Native交互的桥梁,不理解JNI的话,你就只能停留在Java Framework层。这一个系列我们来一起深入学习JNI。 阅读详情

背景:

最近在研究java并发包下的原子操作类部分,该部分的底层实现都依赖于Unsafe方法,于是翻看Unsafe部分的源码,发现很多方法的实现都是naive关键字标注,也都没哟有具体的方法体实现。

带着问题,查阅了相关资料,现做一下总结:

 

概念:

    native关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如C和C++)实现的文件中。Java语言本身不能对操作系统底层进行访问和操作,但是可以通过JNI接口调用其他语言来实现对底层的访问。

    JNI是Java本机接口(Java Native Interface),是一个本机编程接口,它是Java软件开发工具箱(java Software Development Kit,SDK)的一部分。JNI允许Java代码使用以其他语言编写的代码和代码库。Invocation API(JNI的一部分)可以用来将Java虚拟机(JVM)嵌入到本机应用程序中,从而允许程序员从本机代码内部调用Java代码。

 

native用法:

1.编写带有native声明的方法的Java类(java文件)
2.使用javac命令编译编写的Java类(class文件)
3.使用javah -jni ****来生成后缀名为.h的头文件(.h的文件)
4.使用其他语言(C、C++)实现本地方法
5.将本地方法编写的文件生成动态链接库(dll文件)

举例:

  (1)java代码

  class HelloWorld{

        public native void hello(String name);

        static{
            System.loadLibrary("hello");
        }

        public static void main(String[] args){
            new HelloWorld().hello("jni");
        }

    }

(2)javac命令编译

    javac HelloWorld.java

(3)生成.h文件

    javah -jni HelloWorld

生成之后的文件内容

    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class HelloWorld */

    #ifndef _Included_HelloWorld
    #define _Included_HelloWorld
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     HelloWorld
     * Method:    hello
     * Signature: (Ljava/lang/String;)V
     */
    JNIEXPORT void JNICALL Java_HelloWorld_hello
      (JNIEnv *, jobject, jstring);

    #ifdef __cplusplus
    }
    #endif
    #endif

(4)实现该方法

#include <jni.h>
    #include "HelloWorld.h"
    #include <stdio.h>
    JNIEXPORT void JNICALL Java_HelloWorld_hello(JNIEnv *env,jobject obj, jstring name){
        
        const char *str; 
        str = (*env)->GetStringUTFChars(env, name, NULL); 
        if (str == NULL) { 
            return; 
        } 
        
        printf("Hello World! %s \n", str );
        return;
    }

(5)生成动态链接库(ddl)

    cl -I%java_home%\include -I%java_home%\include\win32 -LD HelloWorldImp.c -Fehello.dll

    gcc -m64  -Wl,--add-stdcall-alias -I"C:\Program Files\Java\jdk1.8.0_131\include" -I"C:\Program Files\Java\jdk1.8.0_131\include\win32" -shared -o hello.dll hello.c

 注意:生成的dll文件名在选项-Fe后面配置,这里是hello,因为在HelloWorld.java文件中我们loadLibary的时候使用的名字是hello。当然这里修改之后那里也需要修改。另外需要将-I%java_home%\include -I%java_home%\include\win32参数加上,因为在第四步里面编写本地方法的时候引入了jni.h文件。

 

参考资料:http://blog.youkuaiyun.com/funneies/article/details/8949660

Java层释放由Native增加的对象,使用JNI调用Native代码释放新增对象 如果您需要在Java代码中释放由Native增加的对象,可以使用JNI调用Native代码,然后在Native代码中释放对象。需要注意的是,当您在Java代码中释放Native对象时,您需要确保对象已经被Native代码增加,并且已经创建了全局引用。如果对象没有被增加,或者没有创建全局引用,那么DeleteGlobalRef()函数将无法释放对象。如果您需要在C/C++代码中调用Java代码,可以使用JNI的接口来实现。 阅读详情

相关推荐

芯片设计数字后仿与SDF文件:原理、流程与实战调试指南

在数字芯片设计流程中,时序验证是确保芯片功能正确与性能达标的核心环节。其原理在于通过精确的物理延迟模型,模拟信号在真实硅片上的传播行为,从而暴露理想仿真中无法发现的时序问题。这项技术的核心价值在于它是连接前端逻辑设计与后端物理实现的桥梁,能有效发现建立时间/保持时间违例、时钟偏斜、竞争冒险等关键风险,是保障芯片一次流片成功的关键步骤。其典型应用场景包括高性能计算单元、复杂SoC以及低功耗设计中的状态切换验证。本文聚焦于数字后仿真的具体实施,深入解析SDF文件的结构与反标机制,并提供从环境搭建、波形分析到与静

weixin_34279184的博客 382

【Hotspot】 JNI/JNA调用、Native调用

因为前面 Java Static 中调用的 RegisterNatives 函数用于 JNI 注册,而底层调用的 Java_java_lang_Xxxx_registerNatives() 这些函数本身也是一个 JNI ,那么这些起始的 JNI 函数就是通过 NativeLookup::lookup() 进行注册的。native 是与C++联合开发的时候用的!JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的JNI的基础之上的一个框架。

这个人很懒什么都没有~ 1981

[LaTeX] 使用natbib宏包实现参考文献的“作者-年份”引用格式及常见编译错误排查

本文详细介绍了在LaTeX中使用natbib宏包实现参考文献“作者-年份”引用格式的完整流程。从宏包配置、.bib文件准备到标准编译步骤,重点解析了常见的“Bibliography not compatible with author-year”错误成因,并提供了彻底清理辅助文件等解决方案,帮助用户高效排版符合学术规范的参考文献。

moon9的博客 481

什么是JNI,什么是native,什么是NDK,他们之间是什么关系

Android中的JNI(Java Native Interface)和NDK(Native Development Kit)是两个密切相关但概念上有所不同的部分,它们共同支持在Android应用中使用本地代码(C/C++代码)。

weixin_44102413的博客 692

YOLO训练/写作脚本目录一览 | 涉及标签格式转换、数据扩充、热力图、感受野、精度曲线、数量统计等近百个脚本文件

在大家购买专栏后,便可获得全部的脚本文件。在获取到文件后,只需按照将程序放在个人项目中即可一键运行。

Limiiiing的博客 2376

【以太网硬件六】1000base-T物理层编码究竟是怎么编的?

详述1000base-T物理层4D-PAM5的编码过程

highman110的博客 5324

Java Native 方法和 JNI

JNI是什么       JNI 的全称是 Java Native Interface, Java 程序通过调用JNI 调用非java语言编写的方法。JNI支持Java在不同平台的运行,只要操作系统配备本地存储JNI的dll文件,Java程序可以调用JNI。       一般情况下JNI是由C和C++编写,因为C是面向过程语言,所以更加适合计算机底层逻辑,在相等的时间内,相同功能下,JNI

m0_47912936的博客 676

13. MIC配置

恒玄BES2700,支持3个MIC。

雪飞_海 925

Java本地方法/Java native方法/JNI

JNI主要用于Java调用非Java语言的方法,或者调用操作系统或硬件的方法。在Java中使用时,用native修饰符修饰。在Java虚拟机管理的内存中,由本地方法栈为JNI服务,有些虚拟机直接将虚拟机栈和本地方法栈合二为一,不是所有的虚拟机都支持本地方法。

软件工程探索之旅 1620

Apollo 9.0 参考线生成器 -- ReferenceLineProvider

在基于参考线的规划算法中,参考线是Planning一切工作的基础和前提,所以搞清楚参考线怎么来的就变得很重要。为此,首先需要了解Planning 与 Routing的交互,通过交互得到路径片段,这些路径片段就告诉我们该怎么走,再在此基础上生成参考线,最后使用不同的平滑算法对参考线进行平滑,得到一条光滑的参考线。

WaiNgai 1664

8年ES运维经验整理出的Elasticsearch运维手册(超实用)

k1 : 控制非线性词频率归一化(饱和),Elasticsearch中默认值为1.2。用人能看懂的话说就是词语在文档中出现的次数对于得分的重要性。例如说我觉得在某些场景,一个搜索词在文档中出现越多则越接近我希望搜索的内容,就可以将这个参数调大一点。b :控制文档长度对于分数的惩罚力度。变量b处于分母上,它乘以刚刚讨论过的字段长度的比值,Elasticsearch中的b 默认值为0.75。如果b较大,则文档长度相对于平均长度的影响更大。

yonggeit的博客 5274

安卓java到native_Android JNI学习(三)——Java与Native相互调用

本系列文章如下:1、注册native函数2、JNI中的签名3、native代码反调用Java层代码思维导图如下:image.png前面两篇文章简单的介绍了JNI,下面我们就进一步了解下一下JNI的调用原则,要想了解JNI的调用原则, 前面我们说了JNI中的JNIEnv以及Java类型和native中的类型映射关系。下面我们先来看注册native函数一、注册native函数当Java代码中执行Nat...

weixin_35618933的博客 230

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Java关键字之native详解

native 用来修饰方法,用 native 声明的方法表示告知 JVM 调用,该方法在外部定义,我们可以用任何语言去实现它。简单地讲,一个native Method就是一个 Java 调用非 Java 代码的接口。

Java搜索工程技术栈 4183

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Android JNI学习(二)——Java与Native相互调用

接下来我们来学习 java与Native互相调用 一.简章 1、注册native函数 2、JNI中的签名 3、native代码反调用Java层代码 思维导图如下: 前面一篇文章简单的介绍了JNI,下面我们就进一步了解下一下JNI的调用原则,要想了解JNI的调用原则, 前面我们说了JNI中的JNIEnv以及Java类型和native中的类型映射关系。下面我们先来看注册native函数 一、注册na...

安卓兼职framework和app工程师的博客 975

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

在 Android 中使用 JNI 的总结

最近在研究 Android 相机相关的东西,因为想要对相机做一个封装,于是想到要提供支持滤镜和图像动态识别相关的接口。在我找到一些资料中,它们的实现:一个是基于 OpenGL 的,一个是基于 OpenCV 的。两者都可以直接使用 Java 进行开发,受制于 Java 语言的限制,所以当对程序的性能要求很高的时候,Java 就有些心有余力不足了。所以,有些实现 OpenCV 的方式是在 Native...

weixin_33950035的博客 257

JNI的源码实现分析

关于JNI的实现,我们大概按照三个阶段来分析的,启动阶段的JNI构建阶段,正常运行时Java_call_JNI的阶段,以及在jni_call_java的阶段构建阶段,在系统启动过程中,系统分加载jni相关的核心库,并导入相关的函数实现,同时创建虚拟机对象,并启动虚拟机,注册与此相关的JNI函数。

BASK2311的博客 982

native的详细用法

目录 1、JNI:Java Native Interface 3、用C语言编写程序本地方法   一、编写带有native声明的方法的java类   二、使用javac命令编译所编写的java类,生成.class文件   三、使用javah -jni java类名生成扩展名为 h 的头文件   四、使用C语言实现本地方法 4、JNI...

dinggu1758的博客 1759

jvm是怎么实现Java方法和native方法的连接

Java通过JNI接口调用Java native方法后,将结果反馈给Java方法的过程

weixin_44284706的博客 576

JNI与NDK开发(二)——JNI基本概念 与 Java对C或C++函数的简单调用

JNI与NDK开发(一)——项目初建 我们介绍了一下,JNI(也是NDK开发)环境的搭建步骤,并创建了JNI的Hello World项目。也大体介绍了JNI调用的基本步骤和代码结构。 这一篇,我们将具体介绍一下JNI的一些基本概念,更深的理解JNI的运作过程。在文章的末尾,将介绍JNI调用C的,一种简单的实际步骤(当然,下一章节介绍比较复杂也较为正规的实现步骤)和语法规则。 上图,是上一篇 J...

RedKeyer的博客 353

Day08_JNI、Linux 常用命令

Day08_JNI、Linux 常用命令一、JNI_OnLoadJNI_OnLoad()静态注册动态注册二、native 线程调用 Java三、Linux 常用命令(略) 一、JNI_OnLoad 通过 System.loadLibrary() 去加载 NDK 编译生成的动态库时,内部就会先去找动态库中是否有 JNI_OnLoad 这个函数,找到了就会调用这个函数 JNI_OnLoad 函数会告诉...

韭菜鲜肉大馄饨的专栏 643

java native关键字干什么用的?

今天一不小心跟进Object的源码中,发现一个native关键字,一脸蒙蔽,怎么我从来没有用过。 // 这是计算对象的hsahcode的方法,涉及到内存地址 public native int hashCode(); 1.汇编生c,c生万物,其实java要实现对底层的控制,还是需要c/c++帮忙,老大毕竟是老大。 2.native关键字我们开发应用的时候是用不到的,那什么时...

秦怀杂货店 7732

java jni 原理分析_【源码解读】JNI的实现原理

JNI是Java Native Interface的缩写,它为java提供了调用C和C++代码的能力。java.lang包下的很多类都用到了native方法,比如Class、String、Thread、System,可以说JNI是java语言的基础。了解了JNI的实现原理,可以让我们对java虚拟机有更深的认识。本文主要从源码的角度,分析java虚拟机是如何实现对JNI的支持的。1. native...

weixin_39692253的博客 477

关于java的 native方法及JNI实例

整理,关于java的 native方法及JNI的几篇文章,需要的时候可以拿来看。 JNI探秘-----FileInputStream的read方法详解 java native方法及JNI实例 在 Windows 中实现 Java 本地方法 java 本地方法调用(JNI)

你是我的天晴 547

Android-JNI

JNI 之二 :java & c/c++ 相互通信及调用            JNI是Java Native Interface的缩写,JNI是一种机制,有了它就可以在java程序中调用其他native代码,或者使native代码调用java层的代码。也就是说,有了JNI我们可以使Android项目中,java层与native层各自发挥所长并相互配合。

tangkegaga的专栏 871
上一篇: Redis常用命令总结
下一篇: Object的结构
ITgo
博客等级 码龄9年 14粉丝 65原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值