Java之_初識JNI

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章