將JNI的dll新增到jar包併發布和執行的方法
經常會有這種情況,需要用JNI來實現某些java不支援的操作(比如windows上操作智慧卡),同時又對此操作實現一定的java層面的封裝,並需要釋出給第三方開發者進行使用。一般的處理方式是,提供一個jar包,同時提供一個dll,並要求第三方開發者將此dll拷貝到C:/windows/system32目錄下。這種操作方式不夠傻瓜,最爽的方式當然是和純java一樣,提供一個jar包就全部解決。
首先,Java載入JNI的動態庫,有兩種方式:
System.load(String filename); //指定載入的dll全路徑檔名
System.LoadLibrary(String dllname); //指定載入的dll名(無path,無後綴)
很明顯Load是絕對路徑,LoadLibrary的方式和windows載入dll的方式一樣,按當前目錄和path系統目錄的順序查詢檔案。
但這兩種顯然都不適合動態的部署。因為每個系統的環境變數可能並不完全相同。所以好的方式,是在執行態的時候確定。
思路是:dll在jar包中,也就是屬於類的資源,所以可以在類初始化的時候,從Resource裡面獲得。然後拷貝為一個臨時檔案,由System.load指定全路徑進行載入。並利用臨時檔案的屬性在退出的時候刪除。
如此實現:
public class Test{
static {
try {
InputStream in = Switch.class.getClass().getResource("/NTV.dll").openStream();
File dll = File.createTempFile("NTV", ".dll");
FileOutputStream out = new FileOutputStream(dll);
int i;
byte [] buf = new byte[1024];
while((i=in.read(buf))!=-1) {
out.write(buf,0,i);
}
in.close();
out.close();
dll.deleteOnExit();
System.load(dll.toString());//
}catch (Exception e) {
System.err.println("load jni error!");
}
}
public native int func(String str);
public static void main(String[] args) {
func("hello");
}
}
在eclipse的專案目錄上建立dll目錄,將NTV.dll拷貝進來,並將dll目錄新增到ClassPath。即能進行除錯。在除錯OK後,建立ant工程
<project name="native_method" default="jarop" basedir=".">
<target name="build_javah">
<delete dir="bin" />
<mkdir dir="bin"/>
<javac scrdir="src" dstdir="bin"/>
<javah destdir="jni" classpath="bin" force="yes">
<class name="Test"/>
</javah>
</target>
<target name="jarop">
<jar destfile="Test.jar" >
<fileset dir="bin" includes="**/*.class" />
<fileset dir="dll" includes="NTV.dll" />
<manifest>
<attribute name="Class-Path" value="."/>
<attribute name="Main-Class" value="Test"/>
</manifest>
</jar>
</target>
</project>
此時dll被新增到jar包的根上,嘗試著在任何位置 java -jar */Test.jar 都可以正確的執行。
相關推薦
將JNI的dll新增到jar包併發布和執行的方法
經常會有這種情況,需要用JNI來實現某些java不支援的操作(比如windows上操作智慧卡),同時又對此操作實現一定的java層面的封裝,並需要釋出給第三方開發者進行使用。一般的處理方式是,提供一個jar包,同時提供一個dll,並要求第三方開發者將此dll拷貝到C:/win
在IDEA中如何將Spring boot專案打包成可執行的jar包併發布到linux伺服器
這兩年微服務很流行,這裡簡單介紹一下如何將自己使用idea寫的微服務打包成一個可執行的jar包,併發布到linux伺服器的步驟。因為spring boot有內建的tomcat所以一般使用內建的tomcat就可以可,當然也使用外部的tomcat容器。 如有疑問可
Maven丨使用IDEA中自帶的Maven外掛 將本地的Jar包新增到本地的maven倉庫中
第一步 :點選IDEA右側的Maven Project按鈕, 第二步:點選 Execute Maven Goal 按鈕 彈出”Execute Maven Goal",如下圖: 在command line中 寫入Maven Goal。 &n
將本地的jar包手動新增到本地maven庫中
有些時候需要一些其他資料庫的驅動jar包,但是maven伺服器上沒有收錄的時候就需要將廠商給的jar包手動新增到本地maven庫中: 給出一個例子吧! 希望可以幫助你本地maven庫地址(我的設定為D
Maven丨使用IDEA將本地的Jar包新增到個人的maven倉庫中
有時候我們需要將本地的Jar包加入個人的Maven倉庫中方便專案的Jar包管理,直接將Jar包丟進Maven倉庫是不行的,Maven識別不了。所以我們可以使用命令列將本地的Jar包加入Maven倉庫,本文以IDEA為例子,記錄將本地Jar包安裝到個人Maven倉庫的具體步驟
IDEA將本地的Jar包新增到個人的maven倉庫中
Execuet Maven Goal中執行 install:install-f
Oracle呼叫Java方法(上)如何使用LoadJava命令和如何將簡單的Jar包封裝成Oracle方法
最近在工作中遇到了遇到了一個需求需要將TIPTOP中的資料匯出成XML並上傳到FTP主機中,但是4GL這方面的文件比較少最終決定使用Oracle呼叫Java的方法,在使用的過程中發現有很多的坑,大部分的部落格只粗略的介紹了下導致耗費了很多時間,在這裡分2個博文詳細的記錄一下這個功能,填一下坑,希望可以幫助到大
使用fatjar來實現將包括第三方jar包的項目到處成一個jar包供其它程序使用
選中項 text sin jar dmv padding 安裝 cli itl 一、在線安裝fat jar在線安裝步驟:eclipse菜單條 help >software updates >Search for new features to install&
jar包的生成和使用
class code 系統 test java打包 使用 .class java編譯 pan jar包的生成和jar命令有關,它有很多的參數,創建新的jar包必不可少的參數c,指定jar包文件名的參數f,假如現在想要將test.java打包為test.jar: 1.將
將java打jar包成linux後臺服務service
提示信息 cut star 依賴 jar包 信息 執行 fin expand 將java打jar包成linux後臺服務service 第一步:將java程序打成jar包 build.gradle配置文件中加spring-boot-gradle-plugin插件,具體配置
maven中手動將jar包安裝進倉庫的方法及問題
maven 眾所周知,我們只要在pom.xml文件中進行配置,maven就會自動下載jar包到本地倉庫,那麽,如果我們自己寫一個jar包自己用,那麽便無法通過配置來引用這個包,需要我們手動將包安裝進倉庫中。 我們使用命令mvn install:install-file -Dfile=your-j
nexus搭建maven私服及私服jar包上傳和下載
ive 校驗 public 我們 賬號 依賴 detail 接下來 triangle nexus搭建maven私服及私服jar包上傳和下載 標簽: nexus管理maven庫snapshot 2017-06-28 13:02 844人閱讀 評論(0) 收
maven中下載jar包源碼和javadoc
clip load format code 引用 over resolve -i ise 1:Maven命令下載源碼和javadocs當在IDE中使用Maven時如果想要看引用的jar包中類的源碼和javadoc需要通過maven命令下載這些源碼,然後再進行引入,通過mvn
如何把jar包發布到maven私服
url develop rdp 倉庫 admin party 位置 aging pid 1.格式 mvn deploy:deploy-file -DgroupId=com.qiyi -DartifactId=sphinx -Dversion=1.0 -Dpackaging
多平臺Native庫打入JAR包發布實戰
ecs span 超級 onf docs download uil style 官網下載 1.前言 在開發Java應用的過程中,經常會遇到需要使用C/C++等Native語言編譯的動態庫或靜態庫,在這些情況下往往需要將預先編譯好的各平臺庫文件與JAR包一同發布,鑒於簡潔的原
Spring Boot導出jar包發布
發布 試驗 直接 理想 logs 三方 批處理 cnblogs tro 一:事由現在的項目組開發項目使用的是Spring Boot的技術,開發的時候是直接通過一個入口主函數來啟動項目的。如果將項目交給客戶,怎樣才能正確的發布運行呢?百度了一下有關的知識,大概了解到是通過導出
gradle 將依賴打入Jar包的方法
groov boot 目錄 direct adl bstr leg trap ror 使用的是IDEA,直接引入 plugins { id ‘com.github.johnrengelman.shadow‘ version ‘1.2.3‘ } 放在buil
maven 如何將自己的jar包添加到本地倉庫
ima AI 技術 tid cti 添加 height 本地 fff 1 準備一個需要添加到本地倉庫的jar包 我這裏準備了一個名為mail.jar 的jar包,放到E:\Install Files目錄下面 2 下面演示如何將準備的jar包添加到本地倉庫 1
Gradle多項目構建與jar包發布
depend test 結構 目的 留空 分享圖片 .com 演示 cati Gradle多項目構建 關於項目模塊化: 在企業項目中,包層次和類關系比較復雜,把代碼拆分成模塊通常是最佳實踐,這需要你清晰的劃分功能的邊界,比如把業務邏輯層和數據持久化層拆分開來。項目符合高內
maven 工程下第三方jar 包的引入和打包 war
pom targe .html ext basedir utf main con pack 有時我們需要第三方jar 放在lib 包下 -------位置:/WEB-INF/lib 報編譯出錯,此時: 然後在打包war 發現問題 pom.xml 中引入 ${base