JNI 簡單例子

添加系統變量
JAVA_HOME="C:/Program Files/Java/jdk1.6.0_02"
在CLASSPATH中添加如下內容,如果沒有CLASSPATH則需要新建系統變量
CLASSPATH=".;%JAVA_HOME%/lib;"
PATH添加如下內容,如果沒有path則需要新建系統變量
path="%JAVA_HOME%/bin;"(一定要將其寫在最前面,如果不寫在最前面會優先搜索到其他的java版本)

javah命令使用

利用eclipse編寫程序,在build下面的class放的是編譯完成的.class文件。
在開始--運行輸入cmd進入控制檯,cd到classes目錄下(../bin)
執行javah命令,注意如果要生成的文件在開頭有package *.*.*;
則javah命令如下
javah -jni *.*.*.文件名( *.*.*爲package名稱)否則不能正常執行命令
當然如果沒有package的話直接運行javah 文件名就可以

編譯成功之後形成以保名稱和類名組成的文件名稱格式,形如
edu_bjut_bjwater_test.h

利用vc6.0編程實現dll方法

 選擇new->projects(選擇Win32 Dynamic-Link Library)
 選擇Tools->Options->Directories 添加如下include路徑
     C:/PROGRAM FILES/JAVA/JDK1.6.0_02/INCLUDE
     C:/PROGRAM FILES/JAVA/JDK1.6.0_02/INCLUDE/win32
 根據具體的jdk安裝路徑添加include文件
 將上面生成的.h文件拷貝到工程中,新建**.cpp文件以實現相應的功能
 具體文件內容如下
 ***************************************************************
#include "edu_bjut_bjwater_pub_TestJNI.h"
JNIEXPORT jint JNICALL Java_edu_bjut_bjwater_pub_TestJNI_add
  (JNIEnv *, jobject, jint x, jint y)
{
    return (x+y);
}
****************************************************************
然後編譯生成**.dll文件

JAVA程序完成對dll文件的使用

static {
        System.loadLibrary("jni");   (1)
    }
public native int add(int x,int y);          (2)
注意:(1)中使用loadLibraty()函數對dll文件調用,在這裏有兩個需要明確注意的問題1.這個函數加載的路徑是java.library.path,在這個路徑下搜索jni.dll,那麼到底這個java.library.path路徑是什麼呢?經過打印發現其實就是系統變量中設置的PATH,所以我們可以將dll文件中拷貝到PATH中的路徑下,就可以找到dll文件了,還有一個辦法是通過jvm設置這個路徑,
-Djava.library.path="D:/eclipse_workspace/db2pool/build/classes/dll"
這樣程序就到僅僅到要求的路徑下找需要的dll文件,如果還有其他的訪問java.library.path程序可能會出現錯誤,所以不建議使用這種方法,其實我們可以設置path系統變量,將dll文件的路徑設置成系統變量,就可以增加它的搜索範圍,不至於使其他的程序不能正常的執行.重要說明的是,當設置path環境變量之後,要重新啓動eclipse,因爲在啓動eclipse是java虛擬機讀入path,是不可更改的。
2.loadlibrary()參數我們只需要寫名字就可以,不用寫jni.dll,因爲它會自動去找那個名字的文件,不需要我們指定dll,否則會運行錯誤。
(2)中聲明native函數,所以是在先寫這個java程序,然後在生成的.h文件,在編寫相應的dll文件


編寫操作系統用戶程序
menu:project   ->Settings   dialog 
  link   tab 
  Object/library   modules:   add   the   following   library 
  Netapi32.lib
否則編譯出錯
error   LNK2001:   unresolved   external   symbol   _NetUserEnum@32
生成relese版本dll,通用操作build->set active configuration->*** win32 relese

***************************************************************
總結
LPCSTR/LPSTR/LPCTSTR/LPTSTR/LPCWSTR/LPWSTR/
首先先說一下VC中這幾個代表的是什麼意思
P----pointer
C----const

typedef unsigned short wchar_t
LPSTR/PSTR    --- char *
LPCSTR/PCSTR    --- const char *
LPSTR被定義成是一個指向以NULL('/0')結尾的8位ANSI字符數組指針.
在winnt.h中看到這樣一段定義
#ifdef UNICODE
typedef LPWSTR LPTSTR;
typedef LPCWSTR LPCTSTR;
#else
typedef LPSTR LPTSTR;
typedef LPCSTR LPCTSTR;
#endif
也就是說如果define UNICODE的話LPTSTR與LPWSTR的意思是一樣的,否則的話LPTSTR的意思與LPSTR的意思是一樣的。那麼下面我們在看看LPWSTR是怎麼定義的?
LPWSTR ----- unsigned short *
LPCWSTR----- const unsigned short *
LPWSTR是一個指向以NULL結尾的16位雙字節字符數組指針.

其次講一下他們之間的相互轉化
LPSTR <--->LPCSTR 可以用strcpy()函數完成此功能,將LPCSTR賦值給LPSTR
LPTSTR <--->LPCTST 可以用wcscpy()函數完成此功能,LPCTST->LPTSTR
LPWSTR -->char *
LPWSTR pwz = "some text";
char* psz = new char [wcslen(pwsz) + 1];
wsprintfA ( psz, "%S", pwsz);
The "%S" will implicitly convert UNICODE to ANSI.
LPWSTR <--char *
char* psz = "some text";
wchar_t* pwsz = new wchar_t [strlen(psz) + 1];
wsprintfW ( pwsz, L"%S", psz);
PTSTR轉換爲PSTR是個編碼轉換問題。
編碼轉換可以用MS的函數完成。
WideCharToMultiByte將unicode轉換成ascii
MultiByteToWideChar將ascii轉換成unicode


本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/ethanzhao/archive/2009/05/22/4207107.aspx

發佈了12 篇原創文章 · 獲贊 7 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章