java17forlinux
Ⅰ linux怎麼安裝jstack工具
jstack用於列印出給定的java進程ID或core file或遠程調試服務的Java堆棧信息。
如果是在64位機器上,需要指定選項"-J-d64",Windows的jstack使用方式只支持以下的這種方式:jstack [-l] pid
如果java程序崩潰生成core文件,jstack工具可以用來獲得core文件的java stack和native stack的信息,從而可以輕松地知道java程序是如何崩潰和在程序何處發生問題。
另外,jstack工具還可以附屬到正在運行的java程序中,看到當時運行的java程序的java stack和native stack的信息, 如果現在運行的java程序呈現hung的狀態,jstack是非常有用的。
l 不同的 JAVA虛機的線程 DUMP的創建方法和文件格式是不一樣的,不同的 JVM版本, mp信息也有差別。
l 在實際運行中,往往一次 mp的信息,還不足以確認問題。建議產生三次 mp信息,如果每次 mp都指向同一個問題,我們才確定問題的典型性。
命令格式
$jstack [ option ] pid
$jstack [ option ] executable core
$jstack [ option ] [server-id@]remote-hostname-or-IP
pid: java應用程序的進程號,一般可以通過jps來獲得
executable:產生core mp的java可執行程序
core:列印出的core文件
remote-hostname-or-ip:遠程debug伺服器的名稱或IP
server-id: 唯一id,假如一台主機上多個遠程debug服務
Ⅱ Linux系統下如何安裝JAVA,我的是nbuntu8.10系統
安裝QQ,不用java
源里有eva
還有官方版:http://im.qq.com/qq/linux/download.shtml
如果要裝java
http://wiki.ubuntu.org.cn/Java%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE
ps:源是指某個伺服器上的資源,大部分軟體可以從」源」里直接下載
按照wiki說的,從列表裡復制一段,一般cn99和lupaworld比較快
http://wiki.ubuntu.org.cn/index.php?title=Qref/Source&variant=zh-cn
也可以參考這個的,通過圖形工具來設置:
http://forum.ubuntu.org.cn/viewtopic.php?f=77&t=166326&sid=
eva是山寨qq,在qq for linux未出現以前比較流行,除了在「添加刪除軟體」、「新利得」和sudo apt-get install XXX命令以外,也能點擊頁面上的安裝鏈接
http://wiki.ubuntu.org.cn/index.php?title=Qref/Apps&variant=zh-cn
eva在kubuntu下不錯,在ubuntu下不如官方的qq好用
Ⅲ Linux系統下JDK裝錯了版本怎麼處理
最近要在伺服器上配置JSP環境,看了一下jdk的版本只有1.4,要換成1.6的,現記錄如下。
1、查看jdk的版本:
輸入命令:java –version
返回:
java version 「1.4.2″
gij (GNU libgcj) version 4.1.2 20071124 (Red Hat 4.1.2-42)
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for ing conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
2、卸載jdk1.4
a)查看安裝的jdk以及其依賴的文件
輸入命令:rpm –aq |grep gcj
返回:
libgcj-4.1.2-42.el5
java-1.4.2-gcj-compat-devel-1.4.2.0-40jpp.115
libgcj-devel-4.1.2-42.el5
libgcj-devel-4.1.2-42.el5
java-1.4.2-gcj-compat-src-1.4.2.0-40jpp.115
libgcj-src-4.1.2-42.el5
java-1.4.2-gcj-compat-devel-1.4.2.0-40jpp.115
libgcj-4.1.2-42.el5
java-1.4.2-gcj-compat-1.4.2.0-40jpp.115
b)卸載
rpm -e –nodeps java-1.4.2-gcj-compat-src-1.4.2.0-40jpp.115
rpm -e –nodeps java-1.4.2-gcj-compat-1.4.2.0-40jpp.115
rpm -e –nodeps –allmatches java-1.4.2-gcj-compat-devel-1.4.2.0-40jpp.115
//使用allmatches是因為有兩個java-1.4.2-gcj-compat-devel-1.4.2.0-40jpp.115,不用的話會出現specifies multiple packages錯誤。
[root@mnode work]# java -version
-bash: /usr/bin/java: 沒有那個文件或目錄
安裝新版本JDK
3、jdk1.6安裝
在http://java.sun.com/javase/downloads/index.jsp下載jdk-6u17-linux-x64-rpm.bin放在/tmp目錄下,我的是64為的系統。
進入/tmp目錄:
[root@mnode tmp]# chmod u+x jdk-6u24-linux-x64-rpm.bin
[root@mnode tmp]# ./jdk-6u24-linux-x64-rpm.bin
Unpacking…
Checksumming…
Extracting…
(默認安裝在/usr/java中)。最後讓輸入Enter,然後結束安裝。輸入命令:
[root@mnode tmp]# java -version
java version 「1.6.0_24″
Java(TM) SE Runtime Environment (build 1.6.0_24-b07)
Java HotSpot(TM) 64-Bit Server VM (build 19.1-b02, mixed mode)
配置JDK
4、配置JDK
編輯/etc/profile文件:
[root@mnode jdk1.6.0_24]# vi /etc/profile
在末尾添加:
JAVA_HOME=/usr/java/jdk1.6.0_24
JRE_HOME=/usr/java/jdk1.6.0_24/jre
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
export JAVA_HOME JRE_HOME PATH CLASSPATH
保存退出
輸入命令:
[root@mnode jdk1.6.0_24]# source /etc/profile
查看JAVA_HOME:
[root@mnode jdk1.6.0_24]# echo $JAVA_HOME
/usr/java/jdk1.6.0_24
OK!配置完成。
Ⅳ 我在centOS linux安裝jdk1.6後,運行java或javac命令報錯是雜回事
一、軟體下載
1、下載JDK(下面分別是32位系統和64位系統下的版本)
http://download.oracle.com/otn-pub/java/jdk/7u9-b05/jdk-7u9-linux-i586.tar.gz?AuthParam=1350717577_ #32位
http://download.oracle.com/otn-pub/java/jdk/7u9-b05/jdk-7u9-linux-x64.rpm?AuthParam=1350717726_ #64位
# getconf LONG_BIT # 查看系統多少位
二、安裝JDK7.0版本
1、先卸載伺服器自帶的jdk軟體包
# java -version #查看伺服器是否安裝過jdk
java version "1.6.0_17"
OpenJDK Runtime Environment (IcedTea6 1.7.4) (rhel-1.21.b17.el6-i386)
OpenJDK Client VM (build 14.0-b16, mixed mode)
# rpm -qa |grep gcj #查看伺服器安裝的jdk軟體包信息
libgcj-4.4.4-13.el6.i686
java-1.5.0-gcj-1.5.0.0-29.1.el6.i686
# yum -y remove java-1.5.0-gcj-1.5.0.0-29.1.el6.i686 #卸載軟體包
2、安裝jdk7.0
解壓配置安裝
# mkdir -p /usr/lib/jvm
# tar zxvf jdk-7u9-linux-i586.tar.gz -C /usr/lib/jvm
# mv /usr/lib/jvm/jdk1.7.0_09 /usr/lib/jvm/java7
3、添加jdk7.0到系統環境變數
#cp /etc/profile /etc/profile.bak #備份
#vi /etc/profile #編輯,在最後添加下面的內容
export JAVA_HOME=/usr/lib/jvm/java7
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
#source /etc/profile #使配置文件立即生效
由於系統中可能會有默認的其他版本JDK,所以,為了將我們安裝的JDK設置為默認JDK版本,還要進行如下工作。
update-alternatives --install /usr/bin/java java /usr/lib/jvm/java7/bin/java 300
update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java7/bin/javac 300
update-alternatives --install /usr/bin/jar jar /usr/lib/jvm/java7/bin/jar 300
update-alternatives --install /usr/bin/javah javah /usr/lib/jvm/java7/bin/javah 300
update-alternatives --install /usr/bin/javap javap /usr/lib/jvm/java7/bin/javap 300
執行下面命令,設置默認版本,此命令執行後,系統會列出當前存在的各種JDK版本,會提示你選擇
# update-alternatives --config java
4、測試
# java -version # 測試是否成功
java version "1.7.0_09"
Java(TM) SE Runtime Environment (build 1.7.0_09-b05)
Java HotSpot(TM) Client VM (build 23.5-b02, mixed mode)
Ⅳ java學習路線
目前在職Java開發,我給出的Java學習路線是:
JavaSE--資料庫--jdbc----前端基礎--Javaweb--Spring--Mybatis--Maven--Springboot---Reids--Springcloud--Linux--Git。
JavaSE:java基礎,既然是基礎,那肯定是最重要的,所以學習的時候也是需要重點學習的地方。
資料庫:為什麼要學資料庫呢,因為我們的web數據需要持久化到磁碟上統一管理,而資料庫無疑就是最好工具。目前主流的關系型資料庫有mysql 和oracle。我建議先學mysql。為什麼呢mysql相比Oracle難度要低,而在國內應用場景又是最多的。
學會了mysql可以開發出一個完整的產品了,再學oracle都可以的。
前端基礎:既然是做一個網站,那肯定不能是後台的數據,這樣用戶也是沒辦法看的,所以需要學習前端知識,把數據展示到頁面上,而對於後台人員來說,學習階段只需要學習前端基礎就可以了。Html 、js、css、jquery就可以了。當然到離開後期你也可以學學專門為後端人員定製的前端框架,比如,layui,easyui。如果還覺得不夠可以學學前端專用框架。比如vue element ,但是大前提是把自己的後台學到位了再學其他的。
Javaweb:jsp、servlet。為什麼用了html還要學jsp呢。因為jsp和Java是無縫連接的。學了javaweb以後就可以自己做一個項目出來了,比如你想做一個個人網站。你可以給你們學校做一個教務管理系統都是可以的。
Spring:後台框架。為什麼要用框架呢,可以快速開發,並且降低了耦合。Spring的AOP支持允許將一些通用任務如安全、事務、日誌等進行集中式管理,從而提供了更好的復用,Spring的ORM和DAO提供了與第三方持久層框架的良好整合,並簡化了底層的資料庫訪問。
Mybatis:持久層框架,當然持久層還有一個框架應用也很廣的,那就是hibernate,一個是半自動的一個是全自動,而在國內應用最多的是mybatis,在國外用得最多的是hibernate,具體原因,大家可以網路查查。持久層框架有什麼好處呢?如果你用原始的jdbc做開發,那你得自己來管理每一個連接,連接的打開和關閉,都是有開發人員來操作的,而且jdbc也沒有實體的映射,需要我們寫代碼把值set進去,而用了框架這些都交給框架去做了。
Maven:mavne是一個工具,他的核心是pom.xml,這個配置文件,pom的全英文是project object model,意思是對象管理模型,也就是把項目也看成一個對象來操作了。給我們帶來最直觀的好處就是依賴問題,以前我們需要自己下載jar包,在構建到項目中,但是有了maven只需要寫jar的依賴就可以自動給我們下載了。
Springboot:springboot是基於maven的,springboot最明顯的特點就是開箱即用,也就是構建了一個springboot項目 直接就可以做開發了,而不需要像我們自己配一個springmvc的框架一樣的需要去配置大量的xml文件。讓我們開發人員更著重於業務上的開發。
Redis:前面的mysql,oracle是關系型資料庫,什麼是關系型呢,就是一對一 一對多 多對多。有表與表之間有這些關系在,所以就叫關系型資料庫,而redis就是非關系型資料庫,也就是他存儲數據之間是沒有這些關系,他是以鍵值對 list set方式存儲的。
對了,順便在這里說一下,我目前是在職Java開發,如果你現在也在學習Java,了解Java,渴望成為一名合格的Java開發工程師,在入門學習Java的過程當中缺乏基礎入門的視頻教程,你都可以申請加入我的Java新手學習交流qun:前面輸入是:前面輸入是:七九八,中間輸入是:八四四,最後輸入是:六二零。裡面聚集了很多正在學習Java技術的初學者,qun文件裡面還有我做Java技術這段時間整理的一些學習手冊,面試題,開發工具,PDF文檔書籍教程,需要的話都可以來獲取下載。
Springcloud:微服務框架,什麼是微服務呢,就是把我們傳統的單體服務拆分開了,就是將一個單體架構的應用按業務劃分為一個個的獨立運行的程序即服務,微服務架構其實就是一個分布式架構,具體的就不詳細的講了,因為這裡面牽涉到的解決方案是靈活的。
Linux:linux的應用通常都是在底層,那我們上層開發人員為什麼也要學它呢,其實我們的主要應用是在伺服器上,也就是伺服器的系統。當然系統也有Windows的,而Windows的和Linux的區別就是Windows伺服器有問題是微軟來解決,很方便:別人替你做,但也不方便:你遇到問題都得讓他官方來解決漏洞,但是Linux就不一樣,他是完全開源的,有問題自己馬上就可以解決,只要開發人員能力夠硬去改內核都是可以的。
Git:版本管理工具,與之對應的還有svn,最大的區別在於git是分布式系統,而svn不是分布式的,因為你們進企業以後都是協同開發 也就是一個項目小組裡面幾個小夥伴一起開發一個項目,所以就要有一個代碼的管理工具來保證你們做的不同模塊可以整合,所以說git也是需要學的。
Ⅵ JAVA 需要看Linux的哪一方面的書
嵌入式Linux操作系統學習規劃
ARM+LINUX路線,主攻嵌入式Linux操作系統及其上應用軟體開發目標:
(1) 掌握主流嵌入式微處理器的結構與原理(初步定為arm9)
(2) 必須掌握一個嵌入式操作系統 (初步定為uclinux或linux,版本待定)
(3) 必須熟悉嵌入式軟體開發流程並至少做一個嵌入式軟體項目。
從事嵌入式軟體開發的好處是:
(1)目前國內外這方面的人都很稀缺。這一領域入門門檻較高,所以非專業IT人員很難切入這一領域;另一方面,是因為這一領域較新,目前發展太快,大多數人無條件接觸。
(2)與企業計算等應用軟體不同,嵌入式領域人才的工作強度通常低一些(但收入不低)。
(3)哪天若想創業,搞自已的產品,嵌入式不像應用軟體那樣容易被盜版。硬體設計一般都是請其它公司給訂做(這叫「貼牌」:OEM),都是通用的硬體,我們只管設計軟體就變成自己的產品了。
(4)興趣所在,這是最主要的。
從事嵌入式軟體開發的缺點是:
(1)入門起點較高,所用到的技術往往都有一定難度,若軟硬體基礎不好,特別是操作系統級軟體功底不深,則可能不適於此行。
(2)這方面的企業數量要遠少於企業計算類企業。
(3)有少數公司經常要碩士以上的人搞嵌入式,主要是基於嵌入式的難度。但大多數公司也並無此要求,只要有經驗即可。
(4)平台依託強,換平台比較辛苦。
興趣的由來:
1、成功觀念不同,不虛度此生,就是我的成功。
2、喜歡思考,挑戰邏輯思維。
3、喜歡C
C是一種能發揮思維極限的語言。關於C的精神的一些方面可以被概述成短句如下:
相信程序員。
不要阻止程序員做那些需要去做的。
保持語言短小精幹。
一種方法做一個操作。
使得它運行的夠快,盡管它並不能保證將是可移植的。
4、喜歡底層開發,討厭vb類開發工具(並不是說vb不好)。
5、發展前景好,適合創業,不想自己要死了的時候還是一個工程師。
方法步驟:
1、基礎知識:
目的:能看懂硬體工作原理,但重點在嵌入式軟體,特別是操作系統級軟體,那將是我的優勢。
科目:數字電路、計算機組成原理、嵌入式微處理器結構。
匯編語言、C/C++、編譯原理、離散數學。
數據結構和演算法、操作系統、軟體工程、網路、資料庫。
方法:雖科目眾多,但都是較簡單的基礎,且大部分已掌握。不一定全學,可根據需要選修。
主攻書籍:the c++ programming language(一直沒時間讀)、數據結構-C2。
2、學習linux:
目的:深入掌握linux系統。
方法:使用linux—〉linxu系統編程開發—〉驅動開發和分析linux內核。先看深,那主講原理。看幾遍後,看情景分析,對照深看,兩本交叉,深是綱,情是目。剖析則是0.11版,適合學習。最後深入代碼。
主攻書籍:linux內核完全剖析、unix環境高級編程、深入理解linux內核、情景分析和源代。
3、學習嵌入式linux:
目的:掌握嵌入式處理器其及系統。
方法:(1)嵌入式微處理器結構與應用:直接arm原理及匯編即可,不要重復x86。
(2)嵌入式操作系統類:ucOS/II簡單,開源,可供入門。而後深入研究uClinux。
(3)必須有塊開發板(arm9以上),有條件可參加培訓(進步快,能認識些朋友)。
主攻書籍:毛德操的《嵌入式系統》及其他arm9手冊與arm匯編指令等。
4、深入學習:
A、數字圖像壓縮技術:主要是應掌握MPEG、mp3等編解碼演算法和技術。
B、通信協議及編程技術:TCP/IP協議、802.11,Bluetooth,GPRS、GSM、CDMA等。
2010-8-21 16:46 回復
122.90.173.* 2樓
C、網路與信息安全技術:如加密技術,數字證書CA等。
D、DSP技術:Digital Signal Process,DSP處理器通過硬體實現數字信號處理演算法。
說明:太多細節未說明,可根據實際情況調整。重點在於1、3,不必完全按照順序作。對於學習c++,理由是c++不只是一種語言,一種工具,她還是一種藝術,一種文化,一種哲學理念、但不是拿來炫耀得東西。對於linux內核,學習編程,讀一些優秀代碼也是有必要的。
注意: 要學會舉一反多,有強大的基礎,很多東西簡單看看就能會。想成為合格的程序員,前提是必須熟練至少一種編程語言,並具有良好的邏輯思維。一定要理論結合實踐。
不要一味鑽研技術,雖然擠出時間是很難做到的,但還是要留點餘地去完善其他的愛好,比如宇宙,素描、機械、管理,心理學、游戲、科幻電影。還有一些不願意做但必須要做的!
技術是通過編程編程在編程編出來的。永遠不要夢想一步登天,不要做浮躁的人,不要覺得路途漫上。而是要編程編程在編程,完了在編程,在編程!等機會來了在創業(不要相信有奇跡發生,盲目創業很難成功,即便成功了發展空間也不一定很大)。
嵌入式書籍推薦
Linux基礎
1、《Linux與Unix Shell 編程指南》
C語言基礎
1、《C Primer Plus,5th Edition》Stephen Prata著
2、《The C Programming Language, 2nd Edition》Brian W. Kernighan David M. Rithie(K & R)著
3、《Advanced Programming in the UNIX Environment,2nd Edition》(APUE)
4、《嵌入式Linux應用程序開發詳解》
Linux內核
1、《深入理解Linux內核》(第三版)
2、《Linux內核源代碼情景分析》毛德操 胡希明著
研發方向
1、《UNIX Network Programming》(UNP)
2、《TCP/IP詳解》
3、《Linux內核編程》
4、《Linux設備驅動開發》(LDD)
5、《Linux高級程序設計》 楊宗德著
硬體基礎
1、《ARM體系結構與編程》杜春雷著
2、S3C2410 Datasheet
英語基礎
1、《計算機與通信專業英語》
系統教程
1、《嵌入式系統――體系結構、編程與設計》
2、《嵌入式系統――採用公開源代碼和StrongARM/Xscale處理器》毛德操 胡希明著
3、《Building Embedded Linux Systems》
4、《嵌入式ARM系統原理與實例開發》 楊宗德著
理論基礎
1、《演算法導論》
2、《數據結構(C語言版)》
3、《計算機組織與體系結構?性能分析》
4、《深入理解計算機系統》Randal E. Bryant David O''Hallaron著
5、《操作系統:精髓與設計原理》
6、《編譯原理》
7、《數據通信與計算機網路》
8、《數據壓縮原理與應用》
C語言書籍推薦
1. The C programming language 《C程序設計語言》
2. Pointers on C 《C和指針》
3. C traps and pitfalls 《C陷阱與缺陷》
4. Expert C Lanuage 《專家C編程》
5. Writing Clean Code -----Microsoft Techiniques for Developing Bug-free C Programs
《編程精粹--Microsoft 編寫優質無錯C程序秘訣》
6. Programming Embedded Systems in C and C++ 《嵌入式系統編程》
7.《C語言嵌入式系統編程修煉》
8.《高質量C++/C編程指南》林銳
盡可能多的編碼,要學好C,不能只注重C本身。演算法,架構方式等都很重要。
這里很多書其實是推薦而已,不必太在意,關鍵還是基礎,才是重中之重!!!
Ⅶ 如何產生javacore文件和heapmp文件
JavaCore/HeapDump這兩個文件可以用手工的方式生成,當我們會遇到系統變慢或無響應的情況,這時就以採用手工的方式生成JavaCore及HeapDump文件。
在Unix/Linux上,產生這兩個文件的方法如下:
# ps -ef | grep java
user 4616 4582 0 17:30 pts/0 00:00:00 grep java
root 5580 1 0 Oct27 ? 00:02:27 /usr/bin/java -server -XX:PermSize=64M -XX:MaxPermSize=128m -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file=/usr/local/tomcat8090/conf/logging.properties -Djava.endorsed.dirs=/usr/local/tomcat8090/endorsed -classpath:/usr/local/tomcat8090/bin/bootstrap.jar -Dcatalina.base=/usr/local/tomcat8090 -Dcatalina.home=/usr/local/tomcat8090 -Djava.io.tmpdir=/usr/local/tomcat8090/temp org.apache.catalina.startup.Bootstrap start
# kill -3 5580
首先,找出Java進程id ,然後再執行『kill -3 進程號』的操作,等文件生成後再做一次同樣的操作,再產生一組文件。
詳情請參考:http://blog.csdn.net/newhappy2008/article/details/7592697
Ⅷ 求JAVA新手教程
Java新手入門的30個基本概念
在我們學習Java的過程中,掌握其中的基本概念對我們的學習無論是J2SE,J2EE,J2ME都是很重要的,J2SE是Java的基礎,所以有必要對其中的基本概念做以歸納,以便大家在以後的學習過程中更好的理解java的精髓,在此我總結了30條基本的概念。
Java概述:
目前Java主要應用於中間件的開發(middleware)---處理客戶機於伺服器之間的通信技術,早期的實踐證明,Java不適合pc應用程序的開發,其發展逐漸變成在開發手持設備,互聯網信息站,及車載計算機的開發.Java於其他語言所不同的是程序運行時提供了平台的獨立性,稱許可以在windows,solaris,linux其他操作系統上使用完全相同的代碼.Java的語法與C++語法類似,C++/C程序員很容易掌握,而且Java是完全的徹底的面向對象的,其中提出了很好的GC(Garbage Collector)垃圾處理機制,防止內存溢出。
Java的白皮書為我們提出了Java語言的11個關鍵特性。
(1)Easy:Java的語法比C++的相對簡單,另一個方面就是Java能使軟體在很小的機器上運行,基礎解釋其和類庫的支持的大小約為40kb,增加基本的標准庫和線程支持的內存需要增加125kb。
(2)分布式:Java帶有很強大的TCP/IP協議族的常式庫,Java應用程序能夠通過URL來穿過網路來訪問遠程對象,由於servlet機制的出現,使Java編程非常的高效,現在許多的大的web server都支持servlet。
(3)OO:面向對象設計是把重點放在對象及對象的介面上的一個編程技術.其面向對象和C++有很多不同,在與多重繼承的處理及Java的原類模型。
(4)健壯特性:Java採取了一個安全指針模型,能減小重寫內存和數據崩潰的可能型。
(5)安全:Java用來設計網路和分布系統,這帶來了新的安全問題,Java可以用來構建防病毒和防攻擊的System.事實證明Java在防毒這一方面做的比較好。
(6)中立體系結構:Java編譯其生成體系結構中立的目標文件格式可以在很多處理器上執行,編譯器產生的指令位元組碼(Javabytecode)實現此特性,此位元組碼可以在任何機器上解釋執行。
(7)可移植性:Java中對基本數據結構類型的大小和演算法都有嚴格的規定所以可移植性很好。
(8)多線程:Java處理多線程的過程很簡單,Java把多線程實現交給底下操作系統或線程程序完成.所以多線程是Java作為伺服器端開發語言的流行原因之一。
(9)Applet和servlet:能夠在網頁上執行的程序叫Applet,需要支持Java的瀏覽器很多,而applet支持動態的網頁,這是很多其他語言所不能做到的。
基本概念:
1.OOP中唯一關系的是對象的介面是什麼,就像計算機的銷售商她不管電源內部結構是怎樣的,他只關系能否給你提供電就行了,也就是只要知道can or not而不是how and why.所有的程序是由一定的屬性和行為對象組成的,不同的對象的訪問通過函數調用來完成,對象間所有的交流都是通過方法調用,通過對封裝對象數據,很大限度上提高復用率。
2.OOP中最重要的思想是類,類是模板是藍圖,從類中構造一個對象,即創建了這個類的一個實例(instance)。
3.封裝:就是把數據和行為結合起在一個包中)並對對象使用者隱藏數據的實現過程,一個對象中的數據叫他的實例欄位(instance field)。
4.通過擴展一個類來獲得一個新類叫繼承(inheritance),而所有的類都是由Object根超類擴展而得,根超類下文會做介紹。
5.對象的3個主要特性
behavior---說明這個對象能做什麼.
state---當對象施加方法時對象的反映.
identity---與其他相似行為對象的區分標志.
每個對象有唯一的indentity 而這3者之間相互影響.
6.類之間的關系:
use-a :依賴關系
has-a :聚合關系
is-a :繼承關系--例:A類繼承了B類,此時A類不僅有了B類的方法,還有其自己的方法.(個性存在於共性中)
7.構造對象使用構造器:構造器的提出,構造器是一種特殊的方法,構造對象並對其初始化。
例:Data類的構造器叫Data
new Data()---構造一個新對象,且初始化當前時間.
Data happyday=new Data()---把一個對象賦值給一個變數happyday,從而使該對象能夠多次使用,此處要聲明的使變數與對象變數二者是不同的.new返回的值是一個引用。
構造器特點:構造器可以有0個,一個或多個參數
構造器和類有相同的名字
一個類可以有多個構造器
構造器沒有返回值
構造器總是和new運算符一起使用.
8.重載:當多個方法具有相同的名字而含有不同的參數時,便發生重載.編譯器必須挑選出調用哪個方法。
9.包(package)Java允許把一個或多個類收集在一起成為一組,稱作包,以便於組織任務,標准Java庫分為許多包.java.lang java.util java,net等,包是分層次的所有的java包都在java和javax包層次內。
10.繼承思想:允許在已經存在的類的基礎上構建新的類,當你繼承一個已經存在的類時,那麼你就復用了這個類的方法和欄位,同時你可以在新類中添加新的方法和欄位。
11.擴展類:擴展類充分體現了is-a的繼承關系. 形式為:class (子類) extends (基類)。
12.多態:在java中,對象變數是多態的.而java中不支持多重繼承。
13.動態綁定:調用對象方法的機制。
(1)編譯器檢查對象聲明的類型和方法名。
(2)編譯器檢查方法調用的參數類型。
(3)靜態綁定:若方法類型為priavte static final 編譯器會准確知道該調用哪個方法。
(4)當程序運行並且使用動態綁定來調用一個方法時,那麼虛擬機必須調用x所指向的對象的實際類型相匹配的方法版本。
(5)動態綁定:是很重要的特性,它能使程序變得可擴展而不需要重編譯已存代碼。
14.final類:為防止他人從你的類上派生新類,此類是不可擴展的。
15.動態調用比靜態調用花費的時間要長。
16.抽象類:規定一個或多個抽象方法的類本身必須定義為abstract。
例: public abstract string getDescripition
17.Java中的每一個類都是從Object類擴展而來的。
18.object類中的equal和toString方法。
equal用於測試一個對象是否同另一個對象相等。
toString返回一個代表該對象的字元串,幾乎每一個類都會重載該方法,以便返回當前狀態的正確表示.
(toString 方法是一個很重要的方法)
19.通用編程:任何類類型的所有值都可以同object類性的變數來代替。
20.數組列表:ArrayList動態數組列表,是一個類庫,定義在java.uitl包中,可自動調節數組的大小。
21.class類 object類中的getclass方法返回ckass類型的一個實例,程序啟動時包含在main方法的類會被載入,虛擬機要載入他需要的所有類,每一個載入的類都要載入它需要的類。
22.class類為編寫可動態操縱java代碼的程序提供了強大的功能反射,這項功能為JavaBeans特別有用,使用反射Java能支持VB程序員習慣使用的工具。
能夠分析類能力的程序叫反射器,Java中提供此功能的包叫Java.lang.reflect反射機制十分強大.
1.在運行時分析類的能力。
2.在運行時探察類的對象。
3.實現通用數組操縱代碼。
4.提供方法對象。
而此機制主要針對是工具者而不是應用及程序。
反射機制中的最重要的部分是允許你檢查類的結構.用到的API有:
java.lang.reflect.Field 返回欄位.
java.reflect.Method 返回方法.
java.lang.reflect.Constructor 返回參數.
方法指針:java沒有方法指針,把一個方法的地址傳給另一個方法,可以在後面調用它,而介面是更好的解決方案。
23.介面(Interface)說明類該做什麼而不指定如何去做,一個類可以實現一個或多個interface。
24.介面不是一個類,而是對符合介面要求的類的一套規范。
若實現一個介面需要2個步驟:
1.聲明類需要實現的指定介面。
2.提供介面中的所有方法的定義。
聲明一個類實現一個介面需要使用implements 關鍵字
class actionB implements Comparable 其actionb需要提供CompareTo方法,介面不是類,不能用new實例化一個介面.
25.一個類只有一個超類,但一個類能實現多個介面。Java中的一個重要介面:Cloneable
26.介面和回調.編程一個常用的模式是回調模式,在這種模式中你可以指定當一個特定時間發 生時回調對象上的方法。
例:ActionListener 介面監聽.
類似的API有:java.swing.JOptionPane
java.swing.Timer
java.awt.Tookit
27.對象clone:clone方法是object一個保護方法,這意味著你的代碼不能簡單的調用它。
28.內部類:一個內部類的定義是定義在另一個內部的類。
原因是:
1.一個內部類的對象能夠訪問創建它的對象的實現,包括私有數據。
2.對於同一個包中的其他類來說,內部類能夠隱藏起來。
3.匿名內部類可以很方便的定義回調。
4.使用內部類可以非常方便的編寫事件驅動程序。
29.代理類(proxy):
1.指定介面要求所有代碼
2.object類定義的所有的方法(toString equals)
30.數據類型:Java是強調類型的語言,每個變數都必須先申明它都類型,java中總共有8個基本類型.4種是整型,2種是浮點型,一種是字元型,被用於Unicode編碼中的字元,布爾型。
一、入門
《Java 2從入門到精通》- 推薦
《Thinking in Java》- 強烈推薦*
O』reilly的Java編程基礎系列 - 參考*
二、進階
《Java Cook Book》- 非常推薦* (包含了Java編程的Tips,適合當做手冊來查閱)
《O』reilly-Java IO》- 推薦* (包含Java IO編程的各個方面)
《O』reilly-Database Programming with JDBC》- 推薦* (JDBC編程)
《O』reilly-Java Programming with Oracle JDBC》- 參考*
三、Java Web編程
《O』reilly-Java Server Pages》- 強烈推薦*
《O』reilly-Java Servlet Programming》- 非常推薦*
《O』reilly-Jakarta Struts》- 推薦* (Java Web編程的一個MVC實現框架Struts的書)
四、EJB編程
《J2EE應用與BEA Weblogic Server》- 強烈推薦
《Mastering EJB 2.0》- 非常推薦*
《Enterprise Java Bean》- 推薦*
五、Java XML編程
《O』reilly-Java and XML》- 推薦*
《O』reilly-Java and SOAP》- 參考* (Java的SOAP編程)
六、設計模式
《Core J2EE Patterns》- 強烈推薦* (J2EE設計模式,設計企業應用軟體必備參考書)
《EJB Design Patterns》- 推薦*
頁面功能 【加入收藏】 【推薦給朋友】 【字體:大 中 小】 【關閉】
java編程規范-
作者:佚名 來自:未知
命名規范
定義這個規范的目的是讓項目中所有的文檔都看起來像一個人寫的,增加可讀性,減少項目組中因為換人而帶來的損失。(這些規范並不是一定要絕對遵守,但是一定要讓程序有良好的可讀性)
Package 的命名
Package 的名字應該都是由一個小寫單片語成。
Class 的命名
Class 的名字必須由大寫字母開頭而其他字母都小寫的單片語成
Class 變數的命名
變數的名字必須用一個小寫字母開頭。後面的單詞用大寫字母開頭。
Static Final 變數的命名
Static Final 變數的名字應該都大寫,並且指出完整含義。
參數的命名
參數的名字必須和變數的命名規范一致。
數組的命名
數組應該總是用下面的方式來命名:
byte[] buffer;
而不是:
byte buffer[];
方法的參數
使用有意義的參數命名,如果可能的話,使用和要賦值的欄位一樣的名字:
SetCounter(int size){
this.size = size;
}
Java 文件樣式
所有的 Java(*.java) 文件都必須遵守如下的樣式規則
版權信息
版權信息必須在 java 文件的開頭,比如:
/**
* Copyright ? 2000 Shanghai XXX Co. Ltd.
* All right reserved.
*/
其他不需要出現在 javadoc 的信息也可以包含在這里。
Package/Imports
package 行要在 import 行之前,import 中標準的包名要在本地的包名之前,而且按照字母順序排列。如果 import 行中包含了同一個包中的不同子目錄,則應該用 * 來處理。
package hotlava.net.stats;
import java.io.*;
import java.util.Observable;
import hotlava.util.Application;
這里 java.io.* 使用來代替InputStream and OutputStream 的。
Class
接下來的是類的注釋,一般是用來解釋類的。
/**
* A class representing a set of packet and byte counters
* It is observable to allow it to be watched, but only
* reports changes when the current set is complete
*/
接下來是類定義,包含了在不同的行的 extends 和 implements
public class CounterSet
extends Observable
implements Cloneable
Class Fields
接下來是類的成員變數:
/**
* Packet counters
*/
protected int[] packets;
public 的成員變數必須生成文檔(JavaDoc)。Proceted、private和 package 定義的成員變數如果名字含義明確的話,可以沒有注釋。
存取方法
接下來是類變數的存取的方法。它只是簡單的用來將類的變數賦值獲取值的話,可以簡單的寫在一行上。
/**
* Get the counters
* @return an array containing the statistical data. This array has been
* freshly allocated and can be modified by the caller.
*/
public int[] getPackets() { return Array(packets, offset); }
public int[] getBytes() { return Array(bytes, offset); }
public int[] getPackets() { return packets; }
public void setPackets(int[] packets) { this.packets = packets; }
其它的方法不要寫在一行上
構造函數
接下來是構造函數,它應該用遞增的方式寫(比如:參數多的寫在後面)。
訪問類型 ('public', 'private' 等.) 和 任何 'static', 'final' 或 'synchronized' 應該在一行中,並且方法和參數另寫一行,這樣可以使方法和參數更易讀。
public
CounterSet(int size){
this.size = size;
}
克隆方法
如果這個類是可以被克隆的,那麼下一步就是 clone 方法:
public
Object clone() {
try {
CounterSet obj = (CounterSet)super.clone();
obj.packets = (int[])packets.clone();
obj.size = size;
return obj;
}catch(CloneNotSupportedException e) {
throw new InternalError('Unexpected CloneNotSUpportedException: ' + e.getMessage());
}
}
類方法
下面開始寫類的方法:
/**
* Set the packet counters
* (such as when restoring from a database)
*/
protected final
void setArray(int[] r1, int[] r2, int[] r3, int[] r4)
throws IllegalArgumentException
{
//
// Ensure the arrays are of equal size
//
if (r1.length != r2.length || r1.length != r3.length || r1.length != r4.length)
throw new IllegalArgumentException('Arrays must be of the same size');
System.array(r1, 0, r3, 0, r1.length);
System.array(r2, 0, r4, 0, r1.length);
}
toString 方法
無論如何,每一個類都應該定義 toString 方法:
public
String toString() {
String retval = 'CounterSet: ';
for (int I = 0; I < data.length(); i++) {
retval += data.bytes.toString();
retval += data.packets.toString();
}
return retval;
}
}
main 方法
如果main(String[]) 方法已經定義了, 那麼它應該寫在類的底部.
代碼編寫格式
代碼樣式
代碼應該用 unix 的格式,而不是 windows 的(比如:回車變成回車+換行)
文檔化
必須用 javadoc 來為類生成文檔。不僅因為它是標准,這也是被各種 java 編譯器都認可的方法。使用 @author 標記是不被推薦的,因為代碼不應該是被個人擁有的。
縮進
縮進應該是每行2個空格. 不要在源文件中保存Tab字元. 在使用不同的源代碼管理工具時Tab字元將因為用戶設置的不同而擴展為不同的寬度.
如果你使用 UltrEdit 作為你的 Java 源代碼編輯器的話,你可以通過如下操作來禁止保存Tab字元, 方法是通過 UltrEdit中先設定 Tab 使用的長度室2個空格,然後用 Format|Tabs to Spaces 菜單將 Tab 轉換為空格。
頁寬
頁寬應該設置為80字元. 源代碼一般不會超過這個寬度, 並導致無法完整顯示, 但這一設置也可以靈活調整. 在任何情況下, 超長的語句應該在一個逗號或者一個操作符後折行. 一條語句折行後, 應該比原來的語句再縮進2個字元.
{} 對
{} 中的語句應該單獨作為一行. 例如, 下面的第1行是錯誤的, 第2行是正確的:
if (i>0) { I ++ }; // 錯誤, { 和 } 在同一行
if (i>0) {
I ++
}; // 正確, { 單獨作為一行
} 語句永遠單獨作為一行.
如果 } 語句應該縮進到與其相對應的 { 那一行相對齊的位置。
括弧
左括弧和後一個字元之間不應該出現空格, 同樣, 右括弧和前一個字元之間也不應該出現空格. 下面的例子說明括弧和空格的錯誤及正確使用:
CallProc( Aparameter ); // 錯誤
CallProc(Aparameter); // 正確
不要在語句中使用無意義的括弧. 括弧只應該為達到某種目的而出現在源代碼中。下面的例子說明錯誤和正確的用法:
if ((I) = 42) { // 錯誤 - 括弧毫無意義
if (I == 42) or (J == 42) then // 正確 - 的確需要括弧
程序編寫規范
exit()
exit 除了在 main 中可以被調用外,其他的地方不應該調用。因為這樣做不給任何代碼代碼機會來截獲退出。一個類似後台服務地程序不應該因為某一個庫模塊決定了要退出就退出。
異常
申明的錯誤應該拋出一個RuntimeException或者派生的異常。
頂層的main()函數應該截獲所有的異常,並且列印(或者記錄在日誌中)在屏幕上。
垃圾收集
JAVA使用成熟的後台垃圾收集技術來代替引用計數。但是這樣會導致一個問題:你必須在使用完對象的實例以後進行清場工作。比如一個prel的程序員可能這么寫:
…
{
FileOutputStream fos = new FileOutputStream(projectFile);
project.save(fos, 'IDE Project File');
}
…
除非輸出流一出作用域就關閉,非引用計數的程序語言,比如JAVA,是不能自動完成變數的清場工作的。必須象下面一樣寫:
FileOutputStream fos = new FileOutputStream(projectFile);
project.save(fos, 'IDE Project File');
fos.close();
Clone
下面是一種有用的方法:
implements Cloneable
public
Object clone()
{
try {
ThisClass obj = (ThisClass)super.clone();
obj.field1 = (int[])field1.clone();
obj.field2 = field2;
return obj;
} catch(CloneNotSupportedException e) {
throw new InternalError('Unexpected CloneNotSUpportedException: ' + e.getMessage());
}
}
final 類
絕對不要因為性能的原因將類定義為 final 的(除非程序的框架要求)
如果一個類還沒有準備好被繼承,最好在類文檔中註明,而不要將她定義為 final 的。這是因為沒有人可以保證會不會由於什麼原因需要繼承她。
訪問類的成員變數
大部分的類成員變數應該定義為 protected 的來防止繼承類使用他們。
注意,要用'int[] packets',而不是'int packets[]',後一種永遠也不要用。
public void setPackets(int[] packets) { this.packets = packets; }
CounterSet(int size)
{
this.size = size;
}
編程技巧
byte 數組轉換到 characters
為了將 byte 數組轉換到 characters,你可以這么做:
'Hello world!'.getBytes();
Utility 類
Utility 類(僅僅提供方法的類)應該被申明為抽象的來防止被繼承或被初始化。
初始化
下面的代碼是一種很好的初始化數組的方法:
objectArguments = new Object[] { arguments };
枚舉類型
JAVA 對枚舉的支持不好,但是下面的代碼是一種很有用的模板:
class Colour {
public static final Colour BLACK = new Colour(0, 0, 0);
public static final Colour RED = new Colour(0xFF, 0, 0);
public static final Colour GREEN = new Colour(0, 0xFF, 0);
public static final Colour BLUE = new Colour(0, 0, 0xFF);
public static final Colour WHITE = new Colour(0xFF, 0xFF, 0xFF);
}
這種技術實現了RED, GREEN, BLUE 等可以象其他語言的枚舉類型一樣使用的常量。 他們可以用 == 操作符來比較。
但是這樣使用有一個缺陷:如果一個用戶用這樣的方法來創建顏色 BLACK
new Colour(0,0,0)
那麼這就是另外一個對象,==操作符就會產生錯誤。她的 equal() 方法仍然有效。由於這個原因,這個技術的缺陷最好註明在文檔中,或者只在自己的包中使用。
Swing
避免使用 AWT 組件
混合使用 AWT 和 Swing 組件
如果要將 AWT 組件和 Swing 組件混合起來使用的話,請小心使用。實際上,盡量不要將他們混合起來使用。
滾動的 AWT 組件
AWT 組件絕對不要用 JscrollPane 類來實現滾動。滾動 AWT 組件的時候一定要用 AWT ScrollPane 組件來實現。
避免在 InternalFrame 組件中使用 AWT 組件
盡量不要這么做,要不然會出現不可預料的後果。
Z-Order 問題
AWT 組件總是顯示在 Swing 組件之上。當使用包含 AWT 組件的 POP-UP 菜單的時候要小心,盡量不要這樣使用。
調試
調試在軟體開發中是一個很重要的部分,存在軟體生命周期的各個部分中。調試能夠用配置開、關是最基本的。
很常用的一種調試方法就是用一個 PrintStream 類成員,在沒有定義調試流的時候就為 null,類要定義一個 debug 方法來設置調試用的流。
性能
在寫代碼的時候,從頭至尾都應該考慮性能問題。這不是說時間都應該浪費在優化代碼上,而是我們時刻應該提醒自己要注意代碼的效率。比如:如果沒有時間來實現一個高效的演算法,那麼我們應該在文檔中記錄下來,以便在以後有空的時候再來實現她。
不是所有的人都同意在寫代碼的時候應該優化性能這個觀點的,他們認為性能優化的問題應該在項目的後期再去考慮,也就是在程序的輪廓已經實現了以後。
不必要的對象構造
不要在循環中構造和釋放對象
Ⅸ 怎樣在虛擬機的linux系統上安裝java和tomcat 程序
一、製作ISO
將需要安裝的jdk和tomcat安裝包做成ISO,可利用UltraISO等軟體。
jdk的後綴名是.bin,這里把它叫做jdk.bin
tomcat的後綴名是tar.gz,這里把它叫做tomcat.tar.gz
二、點擊「虛擬機」—>「設置」—>找到剛剛製作的安裝包,點擊確定
三、掛載,輸入命令 mount /mnt/cdrom/
這樣cd /mnt/cdrom/ ,然後 ls -l,可以看到兩個安裝包
四、安裝jdk
1、將jdk安裝包復制到/home/ 目錄
cp jdk.bin /home/
2、到/home/目錄
cd /home/
3、運行安裝包
./jdk.bin
會發現home目錄中有一個名為jdk1.X的文件夾,即安裝成功
五、安裝tomcat
1、將tomcat安裝包復制到/home/ 目錄
cp tomcat.tar.gz /home/
2、到/home/目錄
cd /home/
3、運行安裝包
tar -zxvf tomcat.tar.gz
會發現home目錄中有一個名為tomcat的文件夾,即安裝成功
六、配置環境變數
1、利用vi編輯器編輯文件 vi /etc/profile/
2、在最後追加後保存即可,這樣環境變數也配置完成了。
JAVA_HOME=/home/jdk
PATH=$PATH;/home/jdk/bin
CLASSPATH=.;/home/jdk/lib/rt.jar
CATALINA_HOME=/home/tomcat
export JAVA_HOME PATH CLASSPATH CATALINA_HOME
七、遇到問題
在linux下安裝好tomcat啟動時報如下錯誤:
Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
At least one of these environment variable is needed to run this program
原因:找不到jdk或者jre路徑。
解決辦法:在setclasspath.bat的開頭聲明環境變數,打開tomcat的bin目錄下面的setclasspath.sh,添加紅色部分,路徑修改為自己機器jdk和jre路徑即可。
# -----------------------------------------------------------------------------
# Set CLASSPATH and Java options
#
# $Id: setclasspath.sh 795037 2009-07-17 10:52:16Z markt $
# -----------------------------------------------------------------------------
export JAVA_HOME=/home/jdk
export JRE_HOME=/home/jdk/jre
# Make sure prerequisite environment variables are set
Ⅹ java 如何調用一個已經存在的靜態庫,並輸入和獲取參數! 例如:靜態庫中已經存在函數 ret=ys_tpcall(aa);
給出一個windows下dll的實例。linux下.a的靜態庫只是頭文件和編譯有所不同,另外需要將編譯後的動態庫文件放入/usr/lib下,使用ldconfig載入。
一 先製作一個系統中有的DLL文件(cpp給出的sdk介面)
既然是測試我們就把我們這個dll叫做testDll吧,為了簡單其間,我只寫一個add方法,就是簡單的2個數字相加,對於真正的開發中我們肯定會遇到其他類型,java到c/cpp中類型需要轉換,具體類型轉換對應關系g一下就能得到,我也不在列舉。c/cpp中一個class一般包含2個文件,一個頭文件定義(*.h),一個文件主體(*.c/*.cpp)。啰嗦了這么多還是直接動手吧,先在vs2008中建立一個工程(當然你也可以直接編寫不用這些IDE工具,gcc g++的命令自己g。下同,不在注釋不在廢話),選取win32工程
鍵入工程名字testDll,點擊next選取DLL,然後點擊完成
打開我們的testdll.cpp,添加進我們的add方法
C++代碼
1.int add(int a,int b){
2. return a+b;
3.}
int add(int a,int b){
return a+b;
}
注意到文件列表裡並沒有testDll.h,因為我們要給出調用者一個介面,如果不給頭文件,人家就沒辦法調用,所以我們就必須添加一個頭文件testDll.h。
C++代碼
1.#ifdef TEST_DLL
2.#define TEST_API __declspec(dllexport)
3.#else
4.#define TEST_API __declspec(dllimport)
5.#endif
6.
7./* Set up for C function definitions, even when using C++ */
8.#ifdef __cplusplus
9.extern "C" {
10.#endif
11.
12.TEST_API int add(int,int);
13.
14./* Ends C function definitions when using C++ */
15.#ifdef __cplusplus
16.}
17.#endif
#ifdef TEST_DLL
#define TEST_API __declspec(dllexport)
#else
#define TEST_API __declspec(dllimport)
#endif
/* Set up for C function definitions, even when using C++ */
#ifdef __cplusplus
extern "C" {
#endif
TEST_API int add(int,int);
/* Ends C function definitions when using C++ */
#ifdef __cplusplus
}
#endif
在這個頭文件中我們把我們的add方法給定義了進去。注意到testdll.cpp中#include "stdafx.h",所以我們就把這個testDll.h include進stdafx.h裡面。
按道理說我們的這個dll已經完成了,但是一般c/cpp給介面SDK的時候大都給.h和.lib,為了一步生成dll和lib,我們添加進一個testDll.def,有了這個文件就可以一步生成dll和lib。在source file里右鍵add new item ,選擇Mole-Definition File
鍵入testDll,OK了,我們可以直接build了。生成testDll.dll和testDll.lib。
把testDll.dll扔到system32目錄里等待我們高大威猛的java jni調用。
二 JNI
2.1 編寫java文件
為了顯示我們的與眾相同,我們就把我們的這個java文件命名為Demo.java順便直接帶上包名
,因為我們知道人家給我們的介面里有個add方法,所以我們就直接來個調用吧。
Java代碼
1.package com.testJni.testDemo;
2.
3.public class Demo {
4. static
5. {
6. //System.out.println(System.getProperty("java.library.path"));
7. System.loadLibrary("testDll");
8. System.loadLibrary("jniDll");
9. }
10. public native static int add(int a,int b);
11.
12.}
package com.testJni.testDemo;
public class Demo {
static
{
//System.out.println(System.getProperty("java.library.path"));
System.loadLibrary("testDll");
System.loadLibrary("jniDll");
}
public native static int add(int a,int b);
}
demo.java代碼暫時如此,我們把將要生成的jni的dll叫做jniDll,有童鞋講,我不想用你這個爛名字jniDll多俗啊,沒關系,你可以換,隨你換,生成文件後你再換也可以,現在換也可以。
2.2 生成.h頭文件
javah命令,不多講。生成的文件com_testJni_testDemo_Demo.h這個文件的命名規則我就不多講了,一目瞭然。
C++代碼
1./* DO NOT EDIT THIS FILE - it is machine generated */
2.#include <jni.h>
3./* Header for class com_testJni_testDemo_Demo */
4.
5.#ifndef _Included_com_testJni_testDemo_Demo
6.#define _Included_com_testJni_testDemo_Demo
7.#ifdef __cplusplus
8.extern "C" {
9.#endif
10./*
11. * Class: com_testJni_testDemo_Demo
12. * Method: add
13. * Signature: (II)I
14. */
15.JNIEXPORT jint JNICALL Java_com_testJni_testDemo_Demo_add
16. (JNIEnv *, jclass, jint, jint);
17.
18.#ifdef __cplusplus
19.}
20.#endif
21.#endif
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_testJni_testDemo_Demo */
#ifndef _Included_com_testJni_testDemo_Demo
#define _Included_com_testJni_testDemo_Demo
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_testJni_testDemo_Demo
* Method: add
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_testJni_testDemo_Demo_add
(JNIEnv *, jclass, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
2.3 用c/cpp實現這個頭文件
c/cpp中已經實現了這個add方法,我們只需要調用就可以啦。所以直接vs2008中建立一個dll工程,工程名我們就叫jniDll,具體過程不再多講,方法同上面testDll的建立一樣。在這個工程里kimmking把需要引用的包、文件等已經講的很清楚了。打開jniDll.cpp,添加下面代碼
C++代碼
1.JNIEXPORT jint JNICALL Java_com_testJni_testDemo_Demo_add
2.(JNIEnv *env,jclass jobject,jint a,jint b){
3.
4. return add(a,b);
5.}
JNIEXPORT jint JNICALL Java_com_testJni_testDemo_Demo_add
(JNIEnv *env,jclass jobject,jint a,jint b){
return add(a,b);
}因為int對應的類型就剛好是jint,所以就不需要轉換,其他需要轉換的類型自己g對應關系轉換,注意釋放。
這個工程里我們還需要打開 stdafx.h添加
C++代碼
1.#include <jni.h>
2.
3.#include "testDll.h"
4.#include "com_testJni_testDemo_Demo.h"
#include <jni.h>
#include "testDll.h"
#include "com_testJni_testDemo_Demo.h"
在編譯這個jniDll工程的時候需要引入testDll.h,com_testJni_testDemo_Demo.h,另外添加testDll.lib這個依賴。
好了做好這些後,build下,生成了我們期待已久的jniDll.dll,把這個dll同樣扔到system32下。
三 測試
本人特懶,不想寫多餘的class,所以直接修改Demo.java 這也是剛才為什麼講暫時如此的原因
Java代碼
1.package com.testJni.testDemo;
2.
3.public class Demo {
4. static
5. {
6. //System.out.println(System.getProperty("java.library.path"));
7. System.loadLibrary("testDll");
8. System.loadLibrary("jniDll");
9. }
10. public native static int add(int a,int b);
11. public static void main(String[] args) {
12. System.out.println(add(7,2));
13. }
14.}
package com.testJni.testDemo;
public class Demo {
static
{
//System.out.println(System.getProperty("java.library.path"));
System.loadLibrary("testDll");
System.loadLibrary("jniDll");
}
public native static int add(int a,int b);
public static void main(String[] args) {
System.out.println(add(7,2));
}
}
四 最後補充
如果系統已經載入過c/cpp的dll,我們就不用再System.loadLibrary("testDll")了,載入一遍就可以了,因為我們剛才寫的testDll系統沒有載入,所以我就載入了一下。對於多個dll可以寫多個System.loadLibrary去載入,修改static{}裡面的內容不需要重新生成dll,除非你多加了一個調用方法,如果你看清楚規則,就不用javah命令就可以直接編寫頭文件,用javah太麻煩了。