因需要了解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頭文件:
在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目錄中,因此,可以在項目的屬性配置中的“附加包含目錄”裏添加這兩個路徑:
另外,因爲我使用的eclipse是64位,因此需要在VS的配置管理器中配置一個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.運行程序,則可以看到輸出結果: