只編寫一套 Java 代碼即可使它在安裝了 Java 運行時環境的每個系統上運行
這是 Java 的主要優點之一
但這種平台獨立性有一大缺點
如何利用大量的現有代碼呢?解決這一問題的技巧即使用所謂的 本地方法接口
編寫本地方法需要將 C 代碼導入 Java 應用程序中
在這篇技巧中
我將逐步分析創建本地方法以及在 Java 應用程序中使用這些本地方法的基本步驟
步入本地方法聖殿的七個步驟
創建本地方法的步驟如下所示
編寫 Java 代碼
編譯 Java 代碼
創建 C 頭文件(
h 文件)
創建 C stubs 文件
編寫 C 代碼
創建共享代碼庫(或 DLL)
運行應用程序
我們的任務是在本地方法內向控制台輸出一些文本
本例的細節將特定於一種類 Unix 的系統
明確地說
就是 Linux
我還會指出在細節上與其他平台不同的地方
編寫 Java 代碼
像往常一樣編寫 Java 代碼
要在 Java 代碼中使用本地方法
必須完成兩項任務
首先
為您要使用的每個本地方法編寫本地方法聲明
這與編寫普通 Java 方法接口的聲明沒什麼不同
但您必須指定 native 關鍵字
如下所示
public native void printText ();
必經的第二個環節是您必須顯式地加載本地代碼庫(我們稍後會創建它)
為此
我們在類的一個靜態塊中加載這個庫
static
{
System
loadLibrary (
happy
);
}
為了將這些代碼整合在一起
請創建一個名為 Happy
java 的文件
其內容如下所示
class Happy
{
public native void printText ();
static
{
System
loadLibrary (
happy
); /* 請注意
類名是小寫的! */
}
public static void main(String[] args)
{
Happy happy = new Happy ();
happy
printText ();
}
}
編譯 Java 代碼
編譯 Happy
java 文件
% javac Happy
java
創建 C 頭文件
為了將我們的 C 代碼用作本地方法
您必須使用一些極好的固定做法
Java 編譯器的 javah 功能將根據 Happy 類生成必要的聲明
這將生成 Happy
h 文件
以供在我們的 C 代碼中包括它
% javah Happy
創建 C stubs 文件
回憶一下 C++ 轉換程序對 C++ 方法名的處理
Java 編譯器也有類似的愚蠢行為
為了減輕不得不編寫大量乏味代碼(以便在 Java 運行時系統中調用 C 代碼)的痛苦
Java 編譯器可為我們自動生成必要的框架代碼 (trampoline code)
% javah
stubs Happy
編寫 C 代碼
現在
我們編寫用來顯示問候語的實際代碼
根據約定
我們將這段代碼存入一個文件中
該文件的名稱為我們的 Java 類名加上字符串
Imp
其結果就是 HappyImp
c
請將以下代碼存入 HappyImp
c
#include
/* 標准本地方法信息*/
#include Happyh /* 前面生成的頭文件*/
#include /* 標准 C IO 信息*/
void Happy_printText (struct HHappy *this)
{
puts (Happy New Year!!!);
}
將 C 代碼與 Java 對接還涉及許多其他方面 如如何傳遞和返回 myriad 類型 有關詳細信息請參閱 Java Tutorial 或 Hermetica 的本地方法論文(有關 URL請參閱參考資源部分)
創建共享庫
本部分是與系統最緊密相關的部分似乎每種平台和每種編譯器/鏈接器的組合都用不同的方法來創建和使用共享庫如果您使用的是 Microsoft Windows 平台要了解詳細信息請查看您所用的 C 編譯器的文檔
如果您是 Linux 用戶請閱讀以下使用 GCC 創建共享庫的步驟首先編譯我們所創建的 C 源文件您必須通知編譯器在何處查找此 Java 本地方法的支持文件但此處的主要技巧是您必須顯式通知編譯器生成位置無關的代碼
% gcc I/usr/local/java/include I/usr/local/java/include/genunix fPIC c Happyc HappyImpc
現在請用下面極好的固定做法根據所生成的對象 (o) 文件創建共享庫
% gcc shared Wlsonamelibhappyso o libhappyso Happyo HappyImpo
請將共享庫文件復制為標准短名
% cp libhappyso libhappyso
最後您可能需要通知動態鏈接程序在何處查找這個新的共享庫文件使用 bash shell
% export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH
執行應用程序
像往常一樣運行此 Java 應用程序
% java Happy
好了這就是所要做的全部工作感謝 Tony Dering 提供了 Linux 特定的固定做法
設計點滴
在埋頭為全部遺留代碼編寫本地方法之前我提醒您一定要仔細審查系統看是否可用更好的方法將它們結合到 Java 中例如在 Java 中您可以用 Java 數據庫連接 (JDBC) 甚至更高級的解決方案來訪問數據庫因此請查看您掌握的全部技巧並使用就您手頭的項目而言比較合理的解決方案
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19604.html