文章目录
原理
Java本地方法(Native Method)通过JNI(Java Native Interface)提供的一系列API调用其他语言的函数实现的相对底层的功能。
为什么需要JNI
-
当需要实现的功能依赖操作系统底层的特性,单纯依靠Java无法独立完成,需要借助其他语言;
保证Java在跨平台的同时实现对底层的控制;
-
在Java中直接调用其他语言已经实现的现成功能;
-
使用更加底层的语言实现程序对时间敏感性和性能的要求。
使用JNI的问题
- 当在某个操作系统下使用了JNI标准,将本地代码编译生成了动态链接库后,如果要将这个程序移植到其他操作系统,需要在新的平台重新编译代码生成动态链接库,根本原因是**
JNI
依赖动态链接库,但是动态链接库并不跨平台 **; - 对其他语言的不正确使用可能会造成程序出现错误,例如使用C语言进行内存操作时未及时回收内存可能引起的内存泄漏;
- 对其他语言的依赖过高,提高了Java和其他语言的耦合性,也提高了对项目代码的维护成本。
JNI调用过程
Java通过JNI调用C/C++编译链接后的动态链接库来实现相对底层的功能。
但是C/C++或其他语言编译链接生成动态链接库又是依赖具体操作系统平台的,因此每种平台都有自己的一套动态链接库。而每个平台都有自己的JVM,不同平台下的JVM,会去加载某个固定类型的动态链接库文件,使得依赖于操作系统的功能可以被正常的调用,JVM才能正常跨平台,这一过程可以参考下面的图来进行理解:
实现
环境
- Mac OS 10.15.7;
- 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) {