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++之间的异同。