當前位置:首頁 » 編程語言 » javadll文件

javadll文件

發布時間: 2022-12-13 16:08:22

java中怎麼編寫dll文件........最好舉個例子

你是指使用動態鏈接嗎?這個可以用java中的反射機製做到,但是java中是沒有動態鏈接庫這種東西的。如果你指的是java調用本地dll的話,是使用jni技術,dll也不是java編寫的。總是java是不可能編譯成為dll。有一種這種的方案,就是將java編譯的文件轉換為c#的,微軟有相應的工具,可以搜到,然後就可以打包成為dll了。

Ⅱ 現在我有一個DLL文件,我想在JAVA中調用DLL文件中的方法,請問如何實現

一般那種c#的dll是java不能直接調用的,但C\C++可以,你可以使用JNI。比如你要一個 public native void sengMsg(String msg); 來發送信息,先用native關鍵字聲明這個函數,然後再類裡面加一個靜態塊: static { System.loadLibrary("msg"); } 這里的msg是你的後來編譯的dll文件名,不是簡訊貓帶的。 然後寫其他的函數就可以調用這個方法了,寫完後用javac編譯,得到class文件,然後用 javah -jni 你的class文件 就會得到一個.h的頭文件,用visual studio新建一個dll,把那個.h文件包含進去,用C\C++調用你現有的dll,然後編譯得到你的msg.dll,把它復制到你的class文件目錄,然後就可以調試運行了。

Ⅲ java如何調用別人給的DLL文件

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++程序調用來生成所需的庫文件。

Ⅳ 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載入dll文件

java沒法直接讀,只能先用C++寫一個讀取該dll內容的過程,按JNI規范封裝成dll,然後java載入這個dll執行其中的函數。

Ⅵ 如何在java中調用.dll文件,詳細點帶上代碼這些辣

首先下截JNative組件

jnative.sourceforge.net/ 到這里下載JNative開源項目,我下載的是1.3.2

解壓JNative-<st1:chsdate isrocdate="False" islunardate="False" day="30"
month="12" year="1899">1.3.2</st1:chsdate>.zip

獲得三個文件,分別是:JNativeCpp.dll,libJNativeCpp.so,JNative.jar 。
JNativeCpp.dll
Windows下用的,拷貝到windows / system32目錄下;
libJNativeCpp.so
Linux下的,拷貝到系統目錄下;
JNative.jar這是一個擴展包,導入工程LIB中或將其拷貝到jdk\jre\lib\ext
下,系統會自動載入。

•使用說明

我的項目將使用JNative組件調用一個測試應用伺服器狀態的TestAppSvr.dll文件,Dll文件中包含一個TestConnect()方法,返回一個整形的結果(1或0)

首先配置好JNative組件的windows環境:
將Native要用到JNativeCpp.dll放在系統盤的\WINDOWS\system32下

將JNative.jar導入工程中,新建一個調用類:

java 代碼

復制代碼
代碼如下:

package com.tvjody;

import
java.io.File;
import java.io.FileOutputStream;
import
java.io.IOException;
import java.io.InputStream;

import
org.xvolks.jnative.JNative;
import org.xvolks.jnative.Type;
import
org.xvolks.jnative.exceptions.NativeException;

public class
AppSvrTestConnect {

public AppSvrTestConnect() {

}

/**
* 測試應用伺服器連接狀態
*
* TestConnect

* @param ip 應用伺服器IP
* @param port 埠
* @param
intrcpt 是否採用數據壓縮方式 1 :true 0:false
* @return int 1 :成功 0:失敗

* @throws NativeException
* @throws IllegalAccessException

*/
private static final int TestConnect(String ip, int port, int
intrcpt)throws NativeException, IllegalAccessException {
JNative n
= null;
try {
n = new
JNative("TestAppSvr.dll", "TestConnect");

n.setRetVal(Type.INT);
int i = 0;

n.setParameter(i++, Type.STRING, ip);
n.setParameter(i++,
Type.INT, "" + port);
n.setParameter(i++, Type.INT, "" +
intrcpt);
n.invoke();
return
Integer.parseInt(n.getRetVal());
} finally {
if
(n != null)
n.dispose();
}
}

/**
* 指定Dll文件路徑,動態載入本地鏈接庫,測試應用伺服器連接狀態
* setDllPath

* @param path Dll文件的路徑,不包含DLL名稱 例如:windows - d:\test\test\ unix -
root/test/test/
* @param ip 應用伺服器IP
* @param port 埠

* @param intrcpt 是否採用數據壓縮方式 1 :true 0:false
* @return int 1
:成功 0:失敗
* @throws NativeException
* @throws
IllegalAccessException
*/
public static final int
TestConnectFromDllPath(String path,String ip, int port, int intrcpt) throws
NativeException, IllegalAccessException{
path +=
"TestAppSvr.dll";
System.load(path);
return
TestConnect(ip,port,intrcpt);
}
/**
*
Dll文件放在JRE\bin目錄下面,ClassLoader就能通過System.loadLibrary()動態載入本地鏈接庫
*
TestConnectFromDllPath
* @param ip 應用伺服器IP
* @param port 埠

* @param intrcpt 是否採用數據壓縮方式 1 :true 0:false
* @return int 1
:成功 0:失敗
* @throws NativeException
* @throws
IllegalAccessException
*/
public static final int
TestConnectFromDllPath(String ip, int port, int intrcpt) throws NativeException,
IllegalAccessException{
System.loadLibrary("TestAppSvr");

return TestConnect(ip,port,intrcpt);
}
}

這個類實現了一個靜態私有方法,用來調用Dll文件中的方法返回結果

private static final int TestConnect(String ip, int port, int intrcpt)

兩個靜態公共方法,分兩種方式裝載DLL文件

public static final int TestConnectFromDllPath(String path,String ip, int
port, int intrcpt) //通過DLL文件的路徑
public static final int
TestConnectFromDllPath(String ip, int port, int intrcpt)
//通過ClassLoader
然後新建一個類,調用AppSvrTestConnect.java,實現方法一調用,我是將TestAppSvr.dll文件與Demo.java放在一個目錄下
,所以得到Demo.java的路徑後就可以得到TestAppSvr.dll的路徑,調用AppSvrTestConnect.TestConnectFromDllPath()方法後就能返回正確的信息.方法二是已經將TestAppSvr.dll放在了Jre\bin目錄下,在JVM的Classloader的時候會自動載入,然後通過System.loadLibrary("TestAppSvr")就可以裝配DLL文件.

java 代碼

復制代碼
代碼如下:

public class Demo {
public int
getInfo() throws NativeException, IllegalAccessException{

String path=getClass().getResource(File.separator).getPath();

path = path.substring(1,path.length());

System.out.println(path); //得到DLL文件的路徑

String ip =
"192.168.0.48"; //伺服器IP
int port = 221; //埠

int intrcpt = 1; //數據壓縮方式傳送,1為採用;0為不採用

//方法1 傳入Dll文件的路徑
//int info =
AppSvrTestConnect.TestConnectFromDllPath(path, ip, port, intrcpt);

//方法2 Dll文件已經放在JRE\bin目錄下面
int info =
AppSvrTestConnect.TestConnectFromDllPath(ip, port, intrcpt);

//1為成功,0為失敗
if (info == 1)

System.out.println("應用伺服器可用。");
else

System.out.println("應用伺服器不可用,請檢查IP地址和埠是否正確。");

return info;

}

System.loadLibrary():裝載Windows\System32下或jre\bin或Tomcat\bin目錄下的本地鏈接庫

System.load():根據具體的目錄來加截本地鏈接庫,必須是絕對路徑

•備注

上面的示例工程,因為是例子,所以沒有大多的設計,只是實現了裝載DLL文件,調用DLL文件方法,返回信息.

注意JVM只允許一個默認的ClassLoader來load native library,同時並不提供專門的API來unload一個loaded
native library,所以在項目調試的時候,獨立啟動Web Server.

Ⅶ 怎樣用JAVA調用DLL

1. 編寫範例文檔
public class TestNative
{
private native static int Max(int a,int b);
public static void main(String[] args)
{
System.out.println(Max(4,5));
}
static
{
System.loadLibrary("VCdll");
}
}
其中
LoadLibrary中的DLL文件名稱可以隨便定.只要做好的動態鏈接庫改名成這個字元串就可以了.而native函數的來源就是該動態鏈接庫.
2. 做好該步准備以後,用javac TestNative.java生成TestNative.class. 檢驗語法.
3. 語法檢查通過以後,用javah TestNative生成TestNative.h的C++頭文件.
4. 用VC++6.0創建dll文件:
<1>msdev->new->project->win32 Dynamic-Link Library
<2>Enter project name (e.g. VCdll)
<3>choose "An empty DLL project"->finish
<4>將3生成的TestNative.h和jdk下的jni.h和jni_md.h加入到工程中去
<5>Create a c++ file, implements the native method. as follows:
//TestNative.cpp
#include "TestNative.h"
JNIEXPORT jint JNICALL Java_TestNative_Max
(JNIEnv * a, jclass b, jint x, jint y)
{
return x > y ? x : y;
}

備注:
A 其中的jni.h通常在 jdk\include\ 可以先拷貝到VC安裝目錄下的include目錄下.一勞永逸,以後可以方便使用JNI技術.
B 全部的數據類型需要考慮Java和VC的介面問題.用jint jstring 等.
C 函數名稱和自動生成的.h文件中規定的一致.命名規則是: Java_使用類_方法名
6. 全編譯一下VC++工程.
如果沒有出錯,則此時生成動態鏈接庫成功.
把動態鏈接庫VCdll.dll拷貝到TestNative.java所在的目錄上.
7.運行java TestNative. OK :-)

Ⅷ 如何用Java調用c++生成的dll文件

1
首先要安裝好Visual Studio 2010 (其他版本也行)以及JDK(別忘了配置環境變數),然後安裝Eclipse。以上軟體安裝可自行網路,有很多資料。
2
進入正題,首先在Eclipse中新建工程,File->New->Java Project

3
然後右擊DllTest,New->package,再右擊src目錄下的com包,New->Class。這樣我們的Java項目就建好了。

4

建好的類文件Dlltest.java里添加代碼。主要是導入dll文件的loadlibrary函數和要調用的函數聲明shanfei。代碼詳
見 http://blog.csdn.net/lovesummerforever/article/details/25827199

END
編譯Java工程並生成VC要用到的頭文件

1

在打開cmd,先進到當前java文件所在的目錄,用cd xxx\xxx
命令即可,返回上一級目錄用cd..命令(注意後面的倆點)。到當前目錄,也就是com文件夾下,輸入javac Dlltest.java
指令編譯java文件生成Dlltest.class文件,就在com文件夾下。

2

後再回到上級目錄,就是com文件夾的上一層src目錄(cd..命令),執行javah命令生成頭文件(頭文件DllTest.h就在com的上層文件
夾src中),此處一定注意執行javah命令(javah -classpath . -jni
com.DllTest,注意點兩邊的空格)的目錄,目錄錯誤就會報錯(如上圖所示)。
END
建立VC++工程,生成dll文件

1
打開Visual Studio 2010,新建項目,選擇win32項目

2
下一步,選擇,dll項目,勾選空項目,點擊完成,一個空的dll項目就建好了。

3
還記得之前java項目中生成的DllTest.h文件嗎?它就是Java為C++項目指定的頭文件,java生成頭文件,c++里只需要將頭文件里聲明的函數實現就好了。首先把頭文件復制到C++項目的目錄下並導入到解決方案的頭文件目錄下。

4
新建一個cpp文件,文件名最好與頭文件一致(不一樣也可以),在這個cpp文件中我們要實現頭文件中的函數,需要注意的是函數頭必須跟DllTest.h中的一樣,不能出錯。加完代碼,會發現包含的頭文件jni.h和jni_md.h出錯了,下一步就來解決它。

5

個cpp文件中需要包含兩個java安裝目錄下的頭文件:jni.h和jni_md.h,分別位於java安裝目錄下的include文件夾和
include里的win32文件夾內。找到這兩個文件,復制到Visual Studio VC 2010
的頭文件包含目錄中(我的是MicroSoft Visual Studio
10.0\VC\Include,如圖)。當然也可以把頭文件之直接復制到當前項目的目錄下(記得把代碼改為#include
「jni.h」),但是這樣每次新建項目都得復制粘貼。

6
復制完之後頭文件如果還報錯,就檢查一下VS的包含目錄,確認你把頭文件復制到VS的默認包含目錄中。屬性管理器->Debug->User->通用屬性->VC++目錄->包含目錄(include),添加剛才放置頭文件的目錄即可。

7
解決了上述問題,就可以嘗試編譯項目生成dll文件了,在debug或release模式下點擊生成解決方案,生成成功後到項目目錄的debug或release目錄下找到相應的dll文件。
END
在Java中調用c++生成的dll文件

1
生成了dll文件,終於到了最後一步。把生成的dll文件復制到Java項目的目錄下,注意不是放在com文件夾,也不是src文件夾,是DllTest文件夾內,跟src同級,否則會報錯。

2
還有一點需要注意的是,在Java文件內用LoadLibrary函數調用的庫名必須與Dll文件名一致,而不是跟java類名一致,這點可以參考java 部分的代碼。確認完上述問題,點擊運行,稍等片刻就可以看到運行結果,java&dll之旅到此結束。

熱點內容
xlc編譯選項 發布:2025-01-23 02:11:25 瀏覽:720
電腦訪問存儲伺服器硬碟 發布:2025-01-23 02:08:29 瀏覽:568
lol破解腳本 發布:2025-01-23 02:07:54 瀏覽:129
演算法是步驟 發布:2025-01-23 01:47:22 瀏覽:237
ip訪問控制實驗 發布:2025-01-23 01:41:51 瀏覽:105
crv20萬能落地什麼配置 發布:2025-01-23 01:35:33 瀏覽:172
s10手機怎麼查配置 發布:2025-01-23 01:34:48 瀏覽:890
九陰真經3d免費腳本 發布:2025-01-23 01:33:47 瀏覽:686
gcc編譯分為哪幾個階段 發布:2025-01-23 01:33:45 瀏覽:806
戰地5怎麼看哪個伺服器 發布:2025-01-23 01:33:07 瀏覽:367