JNI 返回階乘 — 整型數據傳遞(一)

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 程序:
輸出結果
10!=3628800

 

 

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