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++之間的異同。