1. JNI (Java Native Interface),Java本地接口.
2. native关键字:使用native所修饰的方法为本地方法,该方法只有声明,没有实现,表示该实现是由c/c++来提供的。
3. jni本质上就是java代码来调用动态链接库的过程(在Windows上,动态链接库就是一个dll文件,在Linux上,动态链接库是一个so文件,如果在Linux上,那么调用的动态链接库文件名必须以lib开始)
4、实例
java程序调用HelloWorld.dll的C++动态链接库
- package com.alibaba.demo.jni;
- public class JniDemo {
- static{
- //不能加后缀, windows上面后缀为dll;在linux下为so,且必须以lib开头
- System.loadLibrary("HelloWorld");
- }
- public native void output();
- public static void main(String[] args) {
- JniDemo jni = new JniDemo();
- jni.output();
- }
- }
步骤1:先编译java -d . JniDemo.java
步骤2:使用javah命令生产c++的头文件:com_alibaba_demo_jni_JniDemo.h
javah com.alibaba.demo.jni.JniDemo,生产的头文件的代码如下:
- /* DO NOT EDIT THIS FILE - it is machine generated */
- #include <jni.h>
- /* Header for class com_alibaba_demo_jni_JniDemo */
- #ifndef _Included_com_alibaba_demo_jni_JniDemo
- #define _Included_com_alibaba_demo_jni_JniDemo
- #ifdef __cplusplus
- extern "C" {
- #endif
- /*
- * Class: com_alibaba_demo_jni_JniDemo
- * Method: output
- * Signature: ()V
- */
- JNIEXPORT void JNICALL Java_com_alibaba_demo_jni_JniDemo_output
- (JNIEnv *, jobject);
- #ifdef __cplusplus
- }
- #endif
- #endif
步骤3:在C++中实现方法
除了引入自己的头文件外,还必须引入Java\jdk1.6.0_18\include\jni.h,在32位的环境下还需要引入Java\jdk1.6.0_18\include\win32\jni_md.h
- JNIEXPORT void JNICALL Java_com_alibaba_demo_jni_JniDemo_output (JNIEnv *, jobject)
- {
- printf("Hello World JNI!\n");
- }
将编译完成的dll文件修改为HelloWorld.dll,并放入到classpath下面
步骤4:使用java com.alibaba.demo.jni.JniDemo执行程序,则此时打印出:Hello World JNI!
基本任务完成
本文转自 tianya23 51CTO博客,原文链接:http://blog.51cto.com/tianya23/461483,如需转载请自行联系原作者