首先下截JNative組件
融水ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!
jnative.sourceforge.net/ 到這里下載JNative開源項(xiàng)目,我下載的是1.3.2
解壓JNative-st1:chsdate isrocdate="False" islunardate="False" day="30"
month="12" year="1899"1.3.2/st1:chsdate.zip
獲得三個(gè)文件,分別是:JNativeCpp.dll,libJNativeCpp.so,JNative.jar 。
JNativeCpp.dll
Windows下用的,拷貝到windows / system32目錄下;
libJNativeCpp.so
Linux下的,拷貝到系統(tǒng)目錄下;
JNative.jar 這是一個(gè)擴(kuò)展包,導(dǎo)入工程LIB中或?qū)⑵淇截惖絡(luò)dk\jre\lib\ext
下,系統(tǒng)會(huì)自動(dòng)加載。
?使用說明
我的項(xiàng)目將使用JNative組件調(diào)用一個(gè)測(cè)試應(yīng)用服務(wù)器狀態(tài)的TestAppSvr.dll文件,Dll文件中包含一個(gè)TestConnect()方法,返回一個(gè)整形的結(jié)果(1或0)
首先配置好JNative組件的windows環(huán)境:
將Native要用到JNativeCpp.dll放在系統(tǒng)盤的\WINDOWS\system32下
將JNative.jar導(dǎo)入工程中,新建一個(gè)調(diào)用類:
java 代碼
復(fù)制代碼
代碼如下:
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() {
}
/**
* 測(cè)試應(yīng)用服務(wù)器連接狀態(tài)
*
* TestConnect
* @param ip 應(yīng)用服務(wù)器IP
* @param port 端口
* @param
intrcpt 是否采用數(shù)據(jù)壓縮方式 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文件路徑,動(dòng)態(tài)加載本地鏈接庫(kù),測(cè)試應(yīng)用服務(wù)器連接狀態(tài)
* setDllPath
* @param path Dll文件的路徑,不包含DLL名稱 例如:windows - d:\test\test\ unix -
root/test/test/
* @param ip 應(yīng)用服務(wù)器IP
* @param port 端口
* @param intrcpt 是否采用數(shù)據(jù)壓縮方式 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()動(dòng)態(tài)加載本地鏈接庫(kù)
*
TestConnectFromDllPath
* @param ip 應(yīng)用服務(wù)器IP
* @param port 端口
* @param intrcpt 是否采用數(shù)據(jù)壓縮方式 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);
}
}
這個(gè)類實(shí)現(xiàn)了一個(gè)靜態(tài)私有方法,用來調(diào)用Dll文件中的方法返回結(jié)果
private static final int TestConnect(String ip, int port, int intrcpt)
兩個(gè)靜態(tài)公共方法,分兩種方式裝載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
然后新建一個(gè)類,調(diào)用AppSvrTestConnect.java,實(shí)現(xiàn)方法一調(diào)用,我是將TestAppSvr.dll文件與Demo.java放在一個(gè)目錄下
,所以得到Demo.java的路徑后就可以得到TestAppSvr.dll的路徑,調(diào)用AppSvrTestConnect.TestConnectFromDllPath()方法后就能返回正確的信息.方法二是已經(jīng)將TestAppSvr.dll放在了Jre\bin目錄下,在JVM的Classloader的時(shí)候會(huì)自動(dòng)加載,然后通過System.loadLibrary("TestAppSvr")就可以裝配DLL文件.
java 代碼
復(fù)制代碼
代碼如下:
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"; //服務(wù)器IP
int port = 221; //端口
int intrcpt = 1; //數(shù)據(jù)壓縮方式傳送,1為采用;0為不采用
//方法1 傳入Dll文件的路徑
//int info =
AppSvrTestConnect.TestConnectFromDllPath(path, ip, port, intrcpt);
//方法2 Dll文件已經(jīng)放在JRE\bin目錄下面
int info =
AppSvrTestConnect.TestConnectFromDllPath(ip, port, intrcpt);
//1為成功,0為失敗
if (info == 1)
System.out.println("應(yīng)用服務(wù)器可用。");
else
System.out.println("應(yīng)用服務(wù)器不可用,請(qǐng)檢查IP地址和端口是否正確。");
return info;
}
System.loadLibrary():裝載Windows\System32下或jre\bin或Tomcat\bin目錄下的本地鏈接庫(kù)
System.load():根據(jù)具體的目錄來加截本地鏈接庫(kù),必須是絕對(duì)路徑
?備注
上面的示例工程,因?yàn)槭抢?所以沒有大多的設(shè)計(jì),只是實(shí)現(xiàn)了裝載DLL文件,調(diào)用DLL文件方法,返回信息.
注意JVM只允許一個(gè)默認(rèn)的ClassLoader來load native library,同時(shí)并不提供專門的API來unload一個(gè)loaded
native library,所以在項(xiàng)目調(diào)試的時(shí)候,獨(dú)立啟動(dòng)Web Server.
JAVA通過JNI調(diào)用本地方法,而本地方法是以庫(kù)文件的形式存放的(在WINDOWS平臺(tái)上是DLL文件形式,在UNIX機(jī)器上是SO文件形式)。通過調(diào)用本地的庫(kù)文件的內(nèi)部方法,使JAVA可以實(shí)現(xiàn)和本地機(jī)器的緊密聯(lián)系,調(diào)用系統(tǒng)級(jí)的各接口方法。
簡(jiǎn)單介紹及應(yīng)用如下:
一、JAVA中所需要做的工作
在JAVA程序中,首先需要在類中聲明所調(diào)用的庫(kù)名稱,如下:
static {
System.loadLibrary(“goodluck”);
}
在這里,庫(kù)的擴(kuò)展名字可以不用寫出來,究竟是DLL還是SO,由系統(tǒng)自己判斷。
還需要對(duì)將要調(diào)用的方法做本地聲明,關(guān)鍵字為native。并且只需要聲明,而不需要具 體實(shí)現(xiàn)。如下:
public native static void set(int i);
public native static int get();
然后編譯該JAVA程序文件,生成CLASS,再用JAVAH命令,JNI就會(huì)生成C/C++的頭文件。
例如程序testdll.java,內(nèi)容為:
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編譯它,會(huì)生成testdll.class。
再用javah testdll,則會(huì)在當(dāng)前目錄下生成testdll.h文件,這個(gè)文件需要被C/C++程序調(diào)用來生成所需的庫(kù)文件。
以下這個(gè)例子實(shí)現(xiàn)的是通過調(diào)用C寫的DLL,計(jì)算字符串長(zhǎng)度。 一、 生成C的頭文件 1. 編輯Main.java public class Main { public native static int getStrNum(byte str[], int strLen); }2. 生成頭文件 按win + r打開“運(yùn)行”窗口,輸入“cmd”,打開DOS控制臺(tái)窗口。進(jìn)入上面Main.java所在的目錄中,輸入: javac Main.java javah Main 兩條命令完成后會(huì)生成Main.h文件 二、 生成DLL 1. 新建空工程 在VS中新建工程:Win32 Console Application,取名“MakeDLL”,選擇空工程。新建后修改工程屬性: (1) General中,將“Configuration Type”改為“Dynamic Library (.dll)”; (2) C/C++的General中,將“Additional Include Directories”添加兩項(xiàng): “C:Program FilesJavajdk1.5.0_06include” “C:Program FilesJavajdk1.5.0_06includewin32” 根據(jù)你安裝的JAVA路徑而設(shè)置,這是因?yàn)樵贑/C++編譯過程中要使用JAVA的jni.h等文件 2. 將上面生成的Main.h添加入工程 3. 新建一個(gè)新的文件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自動(dòng)分配空間,需要傳進(jìn)來字符串長(zhǎng)度參數(shù) jint len = strlen((char*)buffer); return len; }4. 按F7編譯鏈接,生成MakeDLL.dll文件 三、 JAVA調(diào)用DLL 在JAVA中使用上面生成的DLL文件: 1. 將MakeDLL.dll復(fù)制到與使用DLL的JAVA文件相同的目錄下。 2. JAVA文件的源代碼: public class Main { static { System.loadLibrary('MakeDLL'); } 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); } }總結(jié): 另外,JAVA與DLL函數(shù)的參數(shù)傳遞過程,像int類型的,可以直接從JNI函數(shù)參數(shù)列表中獲??;而數(shù)組元素則要通過JNIEnv來獲取: jbyte *buffer = (*env).GetByteArrayElements(str, 0); // str是參數(shù)列表中jbyteArray變量 同理可以獲取char[]的元素。 函數(shù)返回時(shí),可以直接用return語(yǔ)句返回。也可以設(shè)置參數(shù)列表中的變量指針來返回: (*env).SetByteArrayRegion(byteArray, 0, 128, byteArr); byteArray是參數(shù)列表中的jbyteArray變量,作為指針用來返回需要返回的信息;byteArr是jbyte*類型,里面存放的值是要返回的內(nèi)容。 其它的信息可以從Google或Baidu中通過查找“jni”或“java調(diào)用DLL”來查閱到。 (T007)
這個(gè)是 ActiveX 的庫(kù)吧,包裝成一個(gè)組件了,所以你得找個(gè) jacob 這樣的操作 ActiveX 對(duì)象的庫(kù) API.
本文標(biāo)題:java源代碼讀取dll java怎么讀源碼
網(wǎng)頁(yè)地址:http://jinyejixie.com/article18/doseigp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、手機(jī)網(wǎng)站建設(shè)、響應(yīng)式網(wǎng)站、移動(dòng)網(wǎng)站建設(shè)、定制開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)