Java 基础知识:面向对象编程 3-2 Java 本地方法
最编程
2024-10-16 07:18:25
...
2.1 概念
本地方法(Native Method)是用 native
关键字修饰的方法,通常不需要用 Java 语言实现。本地方法允许 Java 代码调用其他语言(如 C/C++)编写的代码。
2.2 JNI:Java Native Interface
JNI(Java Native Interface)是 Java 平台的一部分,从 Java 1.1 开始引入,允许 Java 代码与其他语言编写的代码进行交互。JNI 主要用于以下场景:
- 标准 Java 类库不支持的功能
- 调用已有的 C/C++ 库
- 提高性能,特别是在需要接近硬件或运行次数特别多的方法中
2.2.1 JNI 的优点
- 扩展 Java 功能:可以通过 JNI 调用其他语言编写的库。
- 性能优化:在某些情况下,使用本地代码可以提高性能。
2.2.2 JNI 的缺点
- 跨平台性丧失:本地代码通常不跨平台,需要在不同系统环境下重新编译。
- 安全性降低:本地代码的不当使用可能导致程序崩溃。
2.3 用 C 语言编写本地方法
2.3.1 步骤
-
编写带有 native 方法的 Java 类,生成
.java
文件。 -
编译 Java 类,生成
.class
文件。 -
生成头文件:使用
javah -jni
或javac -h
生成.h
文件。 -
实现本地方法:使用 C/C++ 实现
.h
文件中的方法,生成.c
或.cpp
文件。 -
生成动态链接库:将 C/C++ 编写的文件生成动态链接库(如
.dll
或.so
)。
2.3.2 示例:HelloWorld 程序
-
编写 Java 类:
public class HelloJNI { static { System.loadLibrary("hello"); // 加载动态链接库 } public native void sayHello(); // 声明本地方法 public static void main(String[] args) { new HelloJNI().sayHello(); // 调用本地方法 } }
-
编译 Java 类:
javac HelloJNI.java
-
生成头文件:
javac -h . HelloJNI.java
这将生成
HelloJNI.h
文件。 -
实现本地方法:
#include <jni.h> #include "HelloJNI.h" #include <stdio.h> JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *env, jobject obj) { printf("Hello, JNI!\n"); }
-
编写编译脚本:
# compile.sh gcc -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/darwin" -dynamiclib -o libhello.dylib HelloJNI.c
-
执行脚本:
sh compile.sh
-
运行 Java 程序:
java HelloJNI
2.4 JNI 调用 C 的流程图
Java 代码 -> JNI 接口 -> 本地代码 (C/C++)
2.5 native 关键字
-
native 用于修饰方法,表示该方法的实现在外部定义,通常用 C/C++ 实现。
-
语法:
- 修饰方法的位置必须在返回类型之前。
- 不能用
abstract
修饰,没有方法体。 - 返回值可以是任意类型。
-
native 方法示例
public native void sayHello();
2.6 小结
- JNI 允许 Java 代码与其他语言编写的代码进行交互,扩展了 Java 的功能。
-
本地方法 用
native
关键字修饰,通常用于调用 C/C++ 库或提高性能。 - 注意事项:使用 JNI 会丧失跨平台性,且本地代码的不当使用可能导致程序崩溃。