JNI (JAVA Native Interface) 是 Java 與 C 的橋樑,有些時候要用到 JNI :
- 訪問底層硬件
- 提高代碼運行效率
簡單的整型數據傳遞
- 首先添加環境變量:
- jni.h include=C:\Program Files\Java\jdk1.6.0_13\include
- jni_md.h include=C:\Program Files\Java\jdk1.6.0_13\include\win32
- 用 eclipse 編寫 Java 代碼:D_int.java
package com.ldq.d_int;
public class D_int {
static {
System.loadLibrary("Factorial");
}
public native long getFactorial(int num);
public static void main(String[] args) {
D_int d = new D_int();
int num = 10;
System.out.println(num + "!=" + d.getFactorial(num));
}
}
- 在 bin 目錄下,生成頭文件 com_ldq_d_int_D_int.h:javah -jni com.ldq.d_int.D_int
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_ldq_d_int_D_int */ #ifndef _Included_com_ldq_d_int_D_int #define _Included_com_ldq_d_int_D_int #ifdef __cplusplus extern "C" { #endif /* * Class: com_ldq_d_int_D_int * Method: getFactorial * Signature: (I)J */ JNIEXPORT jlong JNICALL Java_com_ldq_d_1int_D_1int_getFactorial (JNIEnv *, jobject, jint); #ifdef __cplusplus } #endif #endif
- 在 bin 目錄下新建 Factorial.cpp 文件,並根據上面函數定義,編寫代碼:
#include "com_ldq_d_int_D_int.h"
JNIEXPORT jlong JNICALL Java_com_ldq_d_1int_D_1int_getFactorial (JNIEnv *env, jobject obj, jint num)
{
int f=1;
for(int i=1;i<num+1;i++)
{
f*=i;
}
return f;
}
- 編譯 Factorial.cpp 文件,生成 Factorial.dll 文件:cl /LD Factorial.cpp
- 將 Factorial.dll 文件拷貝到工程目錄下,在 eclipse 中運行 Java 程序: