1. 程式人生 > >將JNI的dll新增到jar包併發布和執行的方法

將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