㈠ java中怎麼編寫dll文件........最好舉個例子
你是指使用動態鏈接嗎?這個可以用java中的反射機製做到,但是java中是沒有動態鏈接庫這種東西的。如果你指的是java調用本地dll的話,是使用jni技術,dll也不是java編寫的。總是java是不可能編譯成為dll。有一種這種的方案,就是將java編譯的文件轉換為c#的,微軟有相應的工具,可以搜到,然後就可以打包成為dll了。
㈡ java 如何調用dll
JAVA以其跨平台的特性深受人們喜愛,而又正由於它的跨平台的目的,使得它和本地機器的各種內部聯系變得很少,約束了它的功能。解決JAVA對本地操作的一種方法就是JNI。
JAVA通過JNI調用本地方法,而本地方法是以庫文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX機器上是SO文件形式)。通過調用本地的庫文件的內部方法,使JAVA可以實現和本地機器的緊密聯系,調用系統級的各介面方法。
簡單介紹及應用如下:
一、JAVA中所需要做的工作
在JAVA程序中,首先需要在類中聲明所調用的庫名稱,如下:
static {
System.loadLibrary(「goodluck」);
}
在這里,庫的擴展名字可以不用寫出來,究竟是DLL還是SO,由系統自己判斷。
還需要對將要調用的方法做本地聲明,關鍵字為native。並且只需要聲明,而不需要具 體實現。如下:
public native static void set(int i);
public native static int get();
然後編譯該JAVA程序文件,生成CLASS,再用JAVAH命令,JNI就會生成C/C++的頭文件。
例如程序testdll.java,內容為:
public class testdll
{
static
{
System.loadLibrary("goodluck");
}
public native static int get();
public native static void set(int i);
public static void main(String[] args)
{
testdll test = new testdll();
test.set(10);
System.out.println(test.get());
}
}
用javac testdll.java編譯它,會生成testdll.class。
再用javah testdll,則會在當前目錄下生成testdll.h文件,這個文件需要被C/C++程序調用來生成所需的庫文件。
二、C/C++中所需要做的工作
對於已生成的.h頭文件,C/C++所需要做的,就是把它的各個方法具體的實現。然後編譯連接成庫文件即可。再把庫文件拷貝到JAVA程序的路徑下面,就可以用JAVA調用C/C++所實現的功能了。
接上例子。我們先看一下testdll.h文件的內容:
#i nclude <jni.h>
#ifndef _Included_testdll
#define _Included_testdll
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass);
JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint);
#ifdef __cplusplus
}
#endif
#endif
在具體實現的時候,我們只關心兩個函數原型
JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass); 和
JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint);
這里JNIEXPORT和JNICALL都是JNI的關鍵字,表示此函數是要被JNI調用的。而jint是以JNI為中介使JAVA的int類型與本地的int溝通的一種類型,我們可以視而不見,就當做int使用。函數的名稱是JAVA_再加上java程序的package路徑再加函數名組成的。參數中,我們也只需要關心在JAVA程序中存在的參數,至於JNIEnv*和jclass我們一般沒有必要去碰它。
好,下面我們用testdll.cpp文件具體實現這兩個函數:
#i nclude "testdll.h"
int i = 0;
JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass)
{
return i;
}
JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint j)
{
i = j;
}
編譯連接成庫文件,本例是在WINDOWS下做的,生成的是DLL文件。並且名稱要與JAVA中需要調用的一致,這里就是goodluck.dll 。把goodluck.dll拷貝到testdll.class的目錄下,java testdll運行它,就可以觀察到結果了。
㈢ 請問:Java能編寫DLL嗎
不能,Java是一種虛擬機型語言,而DLL的二進制機器碼
不過現在有軟體能把Java的Class編譯成DLL文件和EXE文件
㈣ java 調用C寫的DLL
一、 生成C的頭文件
1. 編輯Main.java
public class Main
{
public native static int getStrNum(byte str[], int strLen);
}
2. 生成頭文件
按win + r打開「運行」窗口,輸入「cmd」,打開DOS控制台窗口。進入上面Main.java所在的目錄中,輸入:
javac Main.java
javah Main
兩條命令完成後會生成Main.h文件
二、 生成DLL
1. 新建空工程
在VS中新建工程:Win32 Console Application,取名「MakeDLL」,選擇空工程。新建後修改工程屬性:
(1) General中,將「Configuration Type」改為「Dynamic Library (.dll)」;
(2) C/C++的General中,將「Additional Include Directories」添加兩項:
「C:Program FilesJavajdk1.5.0_06include」
「C:Program FilesJavajdk1.5.0_06includewin32」
根據你安裝的JAVA路徑而設置,這是因為在C/C++編譯過程中要使用JAVA的jni.h等文件
2. 將上面生成的Main.h添加入工程
3. 新建一個新的文件main.cpp,代碼如下:
#include 』Main.h』
#include 』string.h』
JNIEXPORT jint JNICALL Java_Main_getStrNum(JNIEnv *env, jclass cls, jbyteArray str, jint strLen)
{
jbyte *buffer = (*env).GetByteArrayElements(str, 0);
buffer[strLen] = 』』; // 由於JAVA自動分配空間,需要傳進來字元串長度參數
jint len = strlen((char*)buffer);
return len;
}
4. 按F7編譯鏈接,生成MakeDLL.dll文件
三、 JAVA調用DLL
在JAVA中使用上面生成的DLL文件:
1. 將MakeDLL.dll復制到與使用DLL的JAVA文件相同的目錄下。
2. JAVA文件的源代碼:
public class Main
{
static
{
System.loadLibrary(』MakeDLL』);//載入資源文件MakeDLL.dll
}
public native static int getStrNum(byte str[], int strLen);
public static void main(String[] args)
{
Main instance = new Main();
String str = new String(』haha』);
int num = instance.getStrNum(str.getBytes(), str.length());
System.out.println(num);
}
}
㈤ java調用C#封裝的DLL文件
先寫一個java類,Java代碼:
packagecom.ypoj.jni;
publicclassTestJNI{
publicnativeintadd(inta,intb);
static{
System.loadLibrary("CallCS");
}
publicstaticvoidmain(String[]args){
TestJNIt=newTestJNI();
System.out.println(t.add(10,20));
}
}
用javah生成的com_ypoj_jni_TestJNI.h,Cpp代碼:
#include<jni.h>
#ifndef_Included_com_ypoj_jni_TestJNI
#define_Included_com_ypoj_jni_TestJNI
#ifdef__cplusplus
extern"C"{
#endif
JNIEXPORTjintJNICALLJava_com_ypoj_jni_TestJNI_add
(JNIEnv*,jobject,jint,jint);
#ifdef__cplusplus
}
#endif
#endif
接下來先完成C#的 Dll,C#代碼:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
namespaceOJMain
{
publicclassOJEntrance
{
privateintresult;
publicintResult
{
get{returnresult+10;}
set{this.result=value;}
}
}
}