一、认识 native 即 JNI,Java Native Interface
Java平台有个用户和本地C代码进行互操作的API,称为Java Native Interface (Java本地接口)。
二、用 Java 调用 C 的“Hello,JNI”
1、创建一个Java类,里面包含着一个 native 的方法和加载库的方法 loadLibrary。
HelloNative.java 代码
public class HelloNative { static { System.loadLibrary("HelloNative"); } public static native void sayHello(); @SuppressWarnings("static-access") public static void main(String[] args) { new HelloNative().sayHello(); } }
2、运行javah,得到包含该方法的C声明头文件.h
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class HelloNative */ #ifndef _Included_HelloNative #define _Included_HelloNative #ifdef __cplusplus extern "C" { #endif /* * Class: HelloNative * Method: sayHello * Signature: ()V */ JNIEXPORT void JNICALL Java_HelloNative_sayHello (JNIEnv *, jclass); #ifdef __cplusplus } #endif #endif
jni.h 这个文件,在%JAVA_HOME%include
3、根据头文件,写C实现本地方法
简单地实现这个sayHello方法
#include "HelloNative.h" #include <stdio.h> JNIEXPORT void JNICALL Java_HelloNative_sayHello { printf("Hello,JNI"); }
添加参数:
(JNIEnv *env, jclass class)
4、生成dll共享库,然后Java程序load库,调用即可
Windows上,MinGW GCC 运行
gcc -m64 -Wl,--add-stdcall-alias -I"C:\Program Files\Java\jdk1.7.0_71\include" -I"C:\Program Files\Java\jdk1.7.0_71\include\include\win32" -shared -o HelloNative.dll HelloNative.c
-m64表示生成dll库是64位
5、运行JAVA
java HelloNative
输出:
Hello, JNI
三、JNI 调用 C 流程图
四、其他
native方法比作Java程序同C程序的接口,其实现步骤
1、在Java中声明native()方法,然后编译;
2、用javah产生一个.h文件;
3、写一个.cpp文件实现native导出方法,其中需要包含第二步产生的.h文件(注意其中又包含了JDK带的jni.h文件);
4、将第三步的.cpp文件编译成动态链接库文件;
5、在Java中用System.loadLibrary()方法加载第四步产生的动态链接库文件,这个native()方法就可以在Java中被访问了。
JAVA本地方法适用的情况
1.为了使用底层的主机平台的某个特性,而这个特性不能通过JAVA API访问
2.为了访问一个老的系统或者使用一个已有的库,而这个系统或这个库不是用JAVA编写的
3.为了加快程序的性能,而将一段时间敏感的代码作为本地方法实现。
参考: