javadll,javadll缺失

本文目錄一覽:

java載入dll文件

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

如何解決java調dll報Unable to load library的錯誤

解決java調dll報Unable to load library的錯誤可以嘗試以下方法:

載入庫文件有兩個函數,System.load 和 System.loadLibrary。

當使用System.load時,需要輸入文件的全路徑,例如:System.load(「/tmp/test.so」);

當使用System.loadlibrary時是在系統的library 的目錄中需找複合條件的庫文件,可以使用-Djava.library.path=[path]參數,來指定Java程序載入庫文件的路徑,或者將庫文件(*.so,*.dll)複製到include的默認路徑,Linux一般是/usr/lib目錄下,當然你可以編輯/etc/ld.so.conf.d/下的文件,設定自己的庫查找路徑ldconfig -v|grep xxx看看有沒有你的動態庫。

Linux還要注意,使用System.loadLibrary(name)方法其中參數內容與Windows有區別,Linux中的的庫文件名為libname.so,Windows為name.dll。

在Windows中盡量使用Windows的C/C++編譯器生成dll文件,否則會出現問題。

不過具體問題還要具體對待!

java調用dll,如何傳入指針變數

問題解答:

1Java中調用指針類型的參數:需要創建Pointer變數,並為其分配空間

2.整形的數據可以直接傳入;

3.JNative對CString類型支持不是很良好,調用CString的方法時,經常會報一些異常,所以我把路徑改成的字元指針;

4.輸入型參數作為輸出:可以參見以上的例子,數組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以其跨平台的特性深受人們喜愛,而又正由於它的跨平台的目的,使得它和本地機器的各種內部聯繫變得很少,約束了它的功能。解決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文件

注意點:1.要對dll裡面的方法做本地聲明

2.載入dll

示例代碼:

public class testdll {

static{

System.loadLibrary(“goodluck”); //注意:不寫擴展名,名字要與dll的文件名一致

}

public native int getValue();

public native void setValue(int i); /**

* @param args

*/

public static void main(String[] args) {

testdll test=new testdll();

test.setValue(10);

System.out.println(test.getValue());

}

}

二、編譯

javac testdll.java ——如果沒有錯,進行下一步

javah testdll ——生成testdll.h這個頭文件

三、實現步驟一中聲明的方法

打開VC++6.0,建立一個dll空工程,把testdll.h導入工程中,新建一個test.cpp源文件

打開testdll.h,發現裡面有兩個方法:

/*

* Class: testdll

* Method: getValue

* Signature: ()I

*/

JNIEXPORT jint JNICALL Java_testdll_getValue

(JNIEnv *, jobject);/*

* Class: testdll

* Method: setValue

* Signature: (I)V

*/

JNIEXPORT void JNICALL Java_testdll_setValue

(JNIEnv *, jobject, jint);

JNIEXPORT不用管,第二個單詞jint/void是返回值,jint相當於int類型,JNICALL不用管,每一個方法名前都有前綴Java_testll_,前兩個參數JNIEnv *和jobject不用管,第二個方法的第三個參數jint就是java文件里的int i。

上面有聲明了,現在就要實現這兩個方法,把代碼補充進來吧:)

示例代碼:

#include “testdll.h”

int i=0;

JNIEXPORT jint JNICALL Java_testdll_getValue

(JNIEnv *, jobject){

return i;

}

JNIEXPORT void JNICALL Java_testdll_setValue

(JNIEnv *, jobject, jint j){

i=j;

}

四、編譯

此時編譯會出現error,主要是提示找不到jni.h(這個包含在testdll.h)里,需要我們把jni.h、jni_md.h複製到C:\Program Files\Microsoft Visual Studio\VC98\Include這個目錄里(默認安裝目錄,如果安裝VC不是這個目錄,請自行找到Include目錄)。

jni.h——————jdk安裝目錄\include

jni_md.h————jdk安裝目錄\include\win32

然後再編譯,構建,就有了test.dll這個動態鏈接庫文件了,把它重命名成goodluck.dll,然後複製到testdll.java的目錄下,運行吧:)

java testdll

結果:

10

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/242245.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 12:47
下一篇 2024-12-12 12:47

相關推薦

發表回復

登錄後才能評論