JNI 入門學習筆記(一)


    因需要了解JNI,故記錄學習筆記於此。本文記錄了使用VC編寫DLL庫,通過Java JNI調用,使用平臺爲 win7 64。

    1.在eclipse中新建Java項目 MyJniTest,添加包 myJni.test,在該包中添加類 TestJni:

package myJni.test;

public class TestJni {
	static {
		System.loadLibrary("MyNative");
	}

	public native static void showInfo();

	public native double sum(double x, double y);
}
    2.在載命令行提示符中進入到項目的 src目錄下,執行下面兩條命令,以生成h頭文件:

執行javac javah 命令
    在src目錄下,可以看到生成了myJni_test_TestJni.h文件,其內容如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class myJni_test_TestJni */

#ifndef _Included_myJni_test_TestJni
#define _Included_myJni_test_TestJni
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     myJni_test_TestJni
 * Method:    showInfo
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_myJni_test_TestJni_showInfo
  (JNIEnv *, jclass);

/*
 * Class:     myJni_test_TestJni
 * Method:    sum
 * Signature: (DD)D
 */
JNIEXPORT jdouble JNICALL Java_myJni_test_TestJni_sum
  (JNIEnv *, jobject, jdouble, jdouble);

#ifdef __cplusplus
}
#endif
#endif
    這裏需注意的一點的是:如果是靜態類型方法則生成的頭文件中方法的第二個參數是對java類的引用(JNIEnv *, jclass),如果不是靜態類型則是對對象的引用(JNIEnv *, jobject)

    3.在 Visual Stdio 中新建win32項目MyNative(我安裝的VS是32位的),在嚮導的“應用程序設置”中選擇“應用程序類型”爲DLL,且將“附加選項”選爲空項目。將上一步生成的頭文件拷貝到MyNative目錄中,並添加到項目的頭文件裏。然後在新建源文件native.c,並添加代碼:

//頭文件jni.h,可以包含,因爲 myJni_test_TestJni.h 文件中已經包含了
//#include <jni.h>

#include "myJni_test_TestJni.h"
#include <stdio.h>

JNIEXPORT jdouble JNICALL Java_myJni_test_TestJni_sum
	(JNIEnv *env, jobject obj, jdouble a, jdouble b)
{
	return a + b;
}

JNIEXPORT void JNICALL Java_myJni_test_TestJni_showInfo
	(JNIEnv *env, jclass cls)
{
	printf("This is my first JNI test!\n");
	return ;
}

    4.注意到在myJni_test_TestJni.h文件中引入了 jni.h,這個文件在JDK目錄下的include目錄中有,同時jni.h文件又引入了jni_md.h文件,這在include/win32目錄中,因此,可以在項目的屬性配置中的“附加包含目錄”裏添加這兩個路徑:

附加jni.h目錄
   另外,因爲我使用的eclipse是64位,因此需要在VS的配置管理器中配置一個64爲的編譯版:

配置64管理器

    5.生成解決方案,則可在項目的x64目錄下的Release目錄中看到相應的DLL文件,將其拷貝MyJniTest項目下。在MyJniTest項目中添加測試文件 MainTest.java(我添加在默包中的),其代碼如下:

import myJni.test.TestJni;

public class MainTest {
	public static void main(String[] args) {
		TestJni testJni = new TestJni();
		TestJni.showInfo();
		System.out.println(testJni.sum(2.0, 3.0));
	}
}
    6.運行程序,則可以看到輸出結果:

JNI測試輸出




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