- 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
- /* 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
- JNIEXPORT void JNICALL Java_HelloNative_sayHello
- {
- printf("Hello,JNI");
- }
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. 为了加快程序的性能,而将一段时间敏感的代码作为本地方法实现。
参考:
来源: http://www.bubuko.com/infodetail-2000076.html