JNI(Java Native Interface)是用于Java与C、C++交互的标准方法,使用JNI我们可以在Java程序中调用C、C++编写的方法。下面以一个简单的示例来说明整个过程。
1、编写Java调用本地方法的类:
public class JNITest { static { /* 加载本地动态库 */ System.loadLibrary("HelloJNI"); } /** * 本地方法定义 * * @param i * @param f * @param d * @param c * @param str * @return */ public native String printDate(int i, float f, double d, char c, String str); /** * Main * * @param args */ public static void main(String[] args) { String str = new JNITest().printDate(2, 2.2f, 1.234567890, 'A', "ABCD"); System.out.println("Native return:" + str); } }
2、上述程序生成.class文件后,使用javah.exe(位于JDK的bin下)生成一个JNITest.h:
F:\javaProject\JNITest\bin>javah JNITest
生成的头文件内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class JNITest */ #ifndef _Included_JNITest #define _Included_JNITest #ifdef __cplusplus extern "C" { #endif /* * Class: JNITest * Method: printDate * Signature: (IFDCLjava/lang/String;)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_JNITest_printDate (JNIEnv *, jobject, jint, jfloat, jdouble, jchar, jstring); #ifdef __cplusplus } #endif #endif
3、编写C++程序,实现本地方法,方法的实现参照第2步生成的头文件里面的方法:
#include "stdafx.h" #include "HelloJNI.h" #include "jni.h" #include "JNITest.h" #include <stdio.h> JNIEXPORT jstring JNICALL Java_JNITest_printDate (JNIEnv *env, jobject obj, jint i, jfloat f, jdouble d, jchar c, jstring str){ printf("C print int:%d\n", i); printf("C print int*float:%f\n", i*f); printf("C print double:%f\n", d); printf("C print char:%c\n", c); printf("C print string:%s\n", str); return str; }按下面的配置指定使用到的头文件jni.h和JNITest.h的路径:
4、上面的程序生成成功后,在工程Debug目录下存在“HelloJNI.dll”文件,现在回到第1步的Java程序,配置运行参数:
运行结果如下:
其中存在乱码,下篇Blog再详细讲一下Java中的数据类型与C、C++之间的异同。