详解Java中native关键字:JNI调用C/C++完整流程
Java中的native关键字用于声明本地方法,其实现由非Java语言(通常是C或C++)提供。该机制基于JNI(Java Native Interface),使Java程序能访问操作系统底层资源。本文将阐述其原理并演示完整的开发流程。
什么是Native Method
Native Method是指由Java调用非Java代码实现的接口。一个典型的例子是java.lang.Object类中的部分方法:
public final native Class<?> getClass();
public native int hashCode();
protected native Object clone() throws CloneNotSupportedException;
这些方法的实现体不在Java文件中,而是以C/C++等形式在其他地方实现。native修饰符可以与除abstract以外的所有Java标识符连用,因为native暗示方法有实现体(尽管不在当前文件),而abstract表示无实现体。final标识的本地方法继承后不能重写。
JNI与使用原则
JNI(Java Native Interface)允许Java代码使用其他语言编写的代码和代码库。调用外部代码时需注意:
- 封装性:将所有本地方法封装到一个类中,针对每种目标平台提供特定的DLL/so版本。
- 独立性:尽量减少第三方运行时依赖,若需提供DLL,必须随应用程序一起分发。
- 兼容性:过度使用JNI会降低应用的可移植性,且在Applet等环境中可能引发安全异常。
开发步骤详解
以下通过一个简单的HelloWorld示例,展示Java调用C程序的五个关键步骤。
第1步:编写带有native声明的Java类
创建一个类,声明native方法并使用System.loadLibrary加载库。
class HelloWorld {
public native void hello();
static {
System.loadLibrary("hello");
}
public static void main(String[] args) {
new HelloWorld().hello();
}
}
第2步:编译Java类
使用javac命令编译源代码:
javac HelloWorld.java
第3步:生成C头文件
使用javah -jni生成供C/C++调用的头文件(假设JDK为旧版结构,新版JDK可能需要使用javac -h或直接查看生成的.class对应的符号):
javah -jni HelloWorld
生成的头文件HelloWorld.h内容如下:
#include <jni.h>
JNIEXPORT void JNICALL Java_HelloWorld_hello(JNIEnv *, jobject);
其中JNIEnv *为JNI环境指针,jobject为Java对象句柄。
第4步:使用C语言实现本地方法
创建实现文件HelloWorldImpl.c,包含必要的头文件并实现函数:
#include <jni.h>
#include "HelloWorld.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_HelloWorld_hello(JNIEnv *env, jobject obj) {
printf("Hello World!\n");
return;
}
第5步:编译动态链接库
在Windows环境下,使用Visual C++编译器将C代码编译为DLL:
cl -I%java_home%\include -I%java_home%\include\win32 -LD HelloWorldImp.c -Fehello.dll
注意生成的DLL文件名hello.dll必须与Java中loadLibrary("hello")指定的名称一致,且需要将-I参数指向JDK的include目录以找到jni.h。
运行与结果验证
将生成的hello.dll放入系统路径或当前工作目录下,运行Java程序:
java HelloWorld
若控制台输出“Hello World!”,则证明JNI调用成功。以上就是Java中native关键字的详细解析及JNI调用流程,更多关于Java底层原理的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









