Java-JNI调用过程

本文详细介绍了Java通过JNI调用本地方法的过程,包括为什么需要JNI、JNI调用的问题以及实现步骤。在实现部分,文章描述了从定义Java native方法、生成头文件、创建CPP文件到编译动态链接库的完整流程,并在测试中解决了找不到动态链接库的问题。最后,文章总结了JNI在代理模式中的角色,强调了其作为跨语言调用桥梁的功能。
摘要由CSDN通过智能技术生成

原理

Java本地方法(Native Method)通过JNI(Java Native Interface)提供的一系列API调用其他语言的函数实现的相对底层的功能。

为什么需要JNI

  1. 当需要实现的功能依赖操作系统底层的特性,单纯依靠Java无法独立完成,需要借助其他语言;

    保证Java在跨平台的同时实现对底层的控制;

  2. 在Java中直接调用其他语言已经实现的现成功能;

  3. 使用更加底层的语言实现程序对时间敏感性和性能的要求。

使用JNI的问题

  1. 当在某个操作系统下使用了JNI标准,将本地代码编译生成了动态链接库后,如果要将这个程序移植到其他操作系统,需要在新的平台重新编译代码生成动态链接库,根本原因是** JNI依赖动态链接库,但是动态链接库并不跨平台 **;
  2. 对其他语言的不正确使用可能会造成程序出现错误,例如使用C语言进行内存操作时未及时回收内存可能引起的内存泄漏;
  3. 对其他语言的依赖过高,提高了Java和其他语言的耦合性,也提高了对项目代码的维护成本。

JNI调用过程

截图

Java通过JNI调用C/C++编译链接后的动态链接库来实现相对底层的功能。

但是C/C++或其他语言编译链接生成动态链接库又是依赖具体操作系统平台的,因此每种平台都有自己的一套动态链接库。而每个平台都有自己的JVM,不同平台下的JVM,会去加载某个固定类型的动态链接库文件,使得依赖于操作系统的功能可以被正常的调用,JVM才能正常跨平台,这一过程可以参考下面的图来进行理解:

截图

实现

环境

  1. Mac OS 10.15.7;
  2. JDK8

1. Java native本地方法定义

package com.wkw.study.jni;

public class JNITest {
   

    static{
   
        //从 java.library.path 路径上加载动态链接库
        System.loadLibrary("MyNativeDll");
    }

    //定义native方法
    public static native void callCPPMethod();

    public static void main(String[] args) {
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值