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();
}

 

}
arrow
arrow
    全站熱搜

    戮克 發表在 痞客邦 留言(0) 人氣()