双色球基本走势图表图双色球基本走势图表图

在Linux平臺上編寫和使用本地方法的具體步驟



作者:未知    文章來源:双色球基本走势图表图 www.pfynwn.com.cn
發布日期:2005年01月19日
在 Linux 平臺上編寫和使用本地方法的具體步驟

作者:John D. Mitchell
摘要
充分利用在非 Java 技術方面的現有投資是接受 Java 技術的關鍵所在。將 Java 與現有代碼結合起來的主要方法就是使用本地方法。本技巧將說明構建本地方法支持和使用本地方法的必要步驟。
只編寫一套 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 <StubPreamble.h> /* 標準本地方法信息。*/
#include "Happy.h" /* 前面生成的頭文件。*/
#include <stdio.h> /* 標準 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 Happy.c HappyImp.c


現在,請用下面極好的固定做法根據所生成的對象 (.o) 文件創建共享庫:

% gcc -shared -Wl,-soname,libhappy.so.1 -o libhappy.so.1.0 Happy.o HappyImp.o


請將共享庫文件復制為標準短名:

% cp libhappy.so.1.0 libhappy.so


最后,您可能需要通知動態鏈接程序在何處查找這個新的共享庫文件。使用 bash shell:

% export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH


執行應用程序
像往常一樣運行此 Java 應用程序:

% java Happy


好了,這就是所要做的全部工作。感謝 Tony Dering 提供了 Linux 特定的固定做法。

設計點滴
在埋頭為全部遺留代碼編寫本地方法之前,我提醒您一定要仔細審查系統,看是否可用更好的方法將它們結合到 Java 中。例如,在 Java 中,您可以用 Java 數據庫連接 (JDBC) 甚至更高級的解決方案來訪問數據庫。因此,請查看您掌握的全部技巧,并使用就您手頭的項目而言比較合理的解決方案。

參考資源

JavaSoft 提供的本地方法教程
//www.javasoft.com/books/Series/Tutorial/native/implementing/index.html
Hermetica 的本地方法論文
//www.hermetica.com/technologia/java/native/  
Copyright © 2002-2012 www.pfynwn.com.cn. All rights reserved.
JSP中文網    備案號:粵ICP備09171188號
成都恒??萍擠⒄褂邢薰?nbsp;   成都市一環路南二段6號新瑞樓三樓8號