HTTP://www.javaeye.com/topic/670114
創建JAVA能調用的dll檔實例
-----------------------------------------------------------
1、編寫一個類檔
package com.xinfeng.intf;
public class Animal {
public native int getAge();
public native void setAge(int age);
public native void say();
public native void run();
}
用native關鍵字修飾將被其它語言實現的方法
2、用javah命令生成.h檔
a、把Animal.java檔編譯成class檔
b、set classpath="x:\testInvokeDll\bin",類檔生成在x:\testInvokeDll\bin\com\xinfeng\intf\Animal.class
c、進入x:\testInvokeDll\bin目錄
d、javah com.xinfeng.intf.Animal
你會發現目前的目錄下多了一個com_xinfeng_intf_Animal.h檔
----------------------------------------------------------------------------
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_xinfeng_intf_Animal */
#ifndef _Included_com_xinfeng_intf_Animal
#define _Included_com_xinfeng_intf_Animal
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_xinfeng_intf_Animal
* Method: getAge
* Signature: ()I
*/
JNIEXPORT jint JNICALL JAVA_com_xinfeng_intf_Animal_getAge
(JNIEnv *, jobject);
/*
* Class: com_xinfeng_intf_Animal
* Method: setAge
* Signature: (I)V
*/
JNIEXPORT void JNICALL JAVA_com_xinfeng_intf_Animal_setAge
(JNIEnv *, jobject, jint);
/*
* Class: com_xinfeng_intf_Animal
* Method: say
* Signature: ()V
*/
JNIEXPORT void JNICALL JAVA_com_xinfeng_intf_Animal_say
(JNIEnv *, jobject);
/*
* Class: com_xinfeng_intf_Animal
* Method: run
* Signature: ()V
*/
JNIEXPORT void JNICALL JAVA_com_xinfeng_intf_Animal_run
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
----------------------------------------------------------------------------
3、生成dll檔,在此以Dev c++ v5.0漢化版為例
a、新建一個dll工程,名叫testdll
b、把裡面的兩個檔移除
c、右擊工程名,添加,選擇com_xinfeng_intf_Animal.h確定
d、新建一個單元,假如名稱為testdll.cpp,把com_xinfeng_intf_Animal.h聲明的方法實現
----------------------------------------------------------------------------
#include <stdio.h>
#include "com_xinfeng_intf_Animal.h"
int age = 0;
JNIEXPORT jint JNICALL JAVA_com_xinfeng_intf_Animal_getAge
(JNIEnv *, jobject)
{
return age;
}
JNIEXPORT void JNICALL JAVA_com_xinfeng_intf_Animal_setAge
(JNIEnv *, jobject, jint _age)
{
age = _age;
}
JNIEXPORT void JNICALL JAVA_com_xinfeng_intf_Animal_say
(JNIEnv *, jobject)
{
printf("Hello World!\n");
}
JNIEXPORT void JNICALL JAVA_com_xinfeng_intf_Animal_run
(JNIEnv *, jobject)
{
printf("Running!\n");
}
----------------------------------------------------------------------------
e、點擊「運行」->「編譯」,這時你會看到很多資料類型沒被聲明的錯誤,那是因為
com_xinfeng_intf_Animal.h使用了很多JAVA_HOME/include/jni.h檔自訂的資料類型,而jni.h又引
用了JAVA_HOME/include/win32/jni_md.h,這時你需要把jni.h和jni_md.h引入到工程裡面來,左擊工程名
「工程屬性」->「檔/目錄」->「包含檔目錄」把JAVA_HOME/include和
JAVA_HOME/include/win32資料夾添加,確定後,再次編譯一切正常,這時在工程
的目錄下就找到testdll.dll檔,這樣dll檔就生成了
4、調用dll檔
a、把testdll.dll檔案複製在專案底下
b、新建一個java檔
----------------------------------------------------------------------
package com.xinfeng.main;
import com.xinfeng.intf.Animal;
public class Main {
static{
/*
* 轉入dll檔,在此不需要尾碼名
* 不同的系統庫檔的尾碼名是不一樣的
* 如windows是dll,而linux是so
* jvm在不同系統會載入相應的庫檔
*/
System.loadLibrary("dellTemplete"); //
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Animal persion = new Animal();
persion.setAge(23);
System.out.println("Age: " + persion.getAge());
persion.say();
persion.run();
}
}
全站熱搜
留言列表