本文目錄一覽:
- 1、java調用c語言編寫的可執行文件
- 2、Java中的循環語句指什麼?
- 3、關於JAVA語言,和C語言有什麼聯繫嗎?
- 4、java如何調用c語言源文件並進行執行?
- 5、Java如何調用C語言代碼 ?
java調用c語言編寫的可執行文件
C代碼寫成這種形式吧:
#includestdio.h
#includestring.h
int main(string argv[]){
char a[100];
strcpy(a,argv[0]);
}
傳入的字串字元個數不能超過100個字元,用指針可以避免這一問題,C++代碼如下:
#includeiostream
using namespace std;
typedef char *String;
int main(String argv[]){
String str;
str=argv[0];
}
Java調用代碼如下所示:
Runtime.getRuntime().exec(“a.exe testString”)
testString是你自己輸入的測試字串
Java中的循環語句指什麼?
和c語言一樣
有fo循環;
while循環;
沒什麼區別.
請採納.
關於JAVA語言,和C語言有什麼聯繫嗎?
Java語言由語法規則和類庫兩部分組成,其中語法規則確定了Java程序的書寫規範,學習好語法規則是Java語言,也是所有編程語言的基本功。本文主要向大家簡單介紹一下Java的語法規則。Java語言與C/C++語言有著緊密的聯繫,Java中的許多術語來自於C++,起語法也來自於C++。因此Java的語法和c++的語法計劃一模一樣。下面簡單介紹一下Java的具體語法。
一、Java的詞法
1、標識符
標識符是類、變數和方法等的名字,作用是讓編譯器能夠識別它們。在Java語言中,標識符可以包含數字、字母、下劃線(_)和美圓符號($),但是不能以數字作為開頭。與C/C++語言不同的是,Java語言還可以將一些非拉丁字母包含在標識符中,這是因為Java語言使用的是Unicode字元,所有的十六進位00C0以上的Unicode字元都可以用在標識符中。但是Java語言的關鍵字是不能用來作為標識符的。
我們在使用標識符的時候應該盡量表達所要表示的類、變數、方法等的含義。另外,標識符中可以使用下劃線,我們應該充分利用這一點以提高程序的可讀性。
2、關鍵字
以下是Java的全部關鍵字:
abstractdoubleintstrictfp**
booleanelseinterfacesuper
breakextendslongswitch
bytefinalnativesynchronized
casefinallynewthis
catchfloatpackagethrow
charforprivatethrows
classgoto*protectedtransient
const*ifpublictry
continueimplementsreturnvoid
defaultimportshortvolatile
doinstanceofstaticwhile
*尚未使用的關鍵字
**為Java2增加的關鍵字
3、注釋
Java有三種形式的注釋:
第一種是C語言的傳統注釋方式,即將「/*」和「*/」之間的文本都視為注釋,這種注釋可以跨越多行。
第二種是C++風格的注釋,即將「//」之後直到行尾的文本都視為注釋,這種注釋只能包含一行。
第三種是Java新增加的注釋方式,即將「/**」和「*/」之間的文本都視為注釋,這種注釋也可以誇耀多行。注意,這種注釋方式生成的注釋將作為Javadoc文檔保存。
二、操作符
1、算術操作符
操作符用途優先順序結合性
++,–自動遞增,自動遞減2(僅次於括弧)從右到左
+,-一元加,一元減2從右到左
*,/乘,除3從左到右
%取余(求模)3從左到右
+,-加,減4從左到右
2、布爾運算與關係運算符
操作符用途優先順序結合性
,,=,=測試相對大小6從左到右
==測試相等性7從左到右
!=測試不等性7從左到右
?:根據第一個操作數返回後兩個操作數之一13從左到右
!非2從右到左
布爾與8從左到右
^異或9從左到右
|布爾或10從左到右
條件與11從左到右
||條件或12從左到右
3、位操作符
操作符用途優先順序結合性
~非(位求補)2從右到左
,左移,右移5從左到右
當作無符號右移5從左到右
位和8從左到右
^位異或9從左到右
|位或10從左到右
4、賦值操作符
操作符用途優先順序結合性
=賦值14從右到左
*=操作同時賦值14從右到左
/=操作同時賦值14從右到左
%=操作同時賦值14從右到左
+=操作同時賦值14從右到左
-=操作同時賦值14從右到左
=操作同時賦值14從右到左
=操作同時賦值14從右到左
=操作同時賦值14從右到左
^=操作同時賦值14從右到左
|=操作同時賦值14從右到左
=操作同時賦值14從右到左
5、特殊操作符
cast操作符將一種數據類型轉換成為另一種數據類型,cast應寫成把要校正操作數的類型名放在括弧中。
例如:inti;longl;l=7876547;i=(int)l;如果給高精度的變數賦予一個低精度值,則不需校正。類型校正操作符的優先順序為2,結合性為從右到左結合。
將以上講到的操作符的優先順序總結如下:
優先順序運算符結合順序
1[]數組運算.點運算符()調用方法從左到右
2!~++–+(一元加)-(一元減)()強制類型轉換new從右到左
3*/%從左到右
4+(二元加)-(二元減)從左到右
5從左到右
6==instanceof從左到右
7==!=從左到右
8從左到右
9^從左到右
10|從左到右
11從左到右
12||從左到右
13?:從左到右
14=+=-=*=/=%==|=^====從右到左
三、常量
1、整型常量
在Java語言中,整型常量有三種形式,它們分別是:十進位、八進位、十六進位。
需要注意的是十進位數不能以0開頭,這是因為八進位的數是以0開頭的,而十六進位數以0x或0X開頭。
2、浮點型常量
浮點數只能表示十進位數。浮點數有兩種表示方法,即標準表示法和科學記數法。浮點數又分為單精度數和雙精度數。
3、布爾型常量
布爾型常量有兩個值:ture(或TURE)和false(或FALSE)它們分別表示真和假,這兩個值用來表示事物的狀態,它們必居其一。通過測量布爾值可以判斷是否執行某個步驟。
4、字元型常量
字元型常量是一個單一的字元,其形式是由兩個單引號引起來的一個字元。但是兩個單引號引起來的不能是單引號和反斜杠,即『’』和『\』是不正確的寫法。
大家一定要記住,Java語言中的字元是16位的Unicode字元,這與C/C++等語言是不一樣的。
同C/C++語言一樣,Java語言也有轉意序列。Java中的轉意序列的功能見下表:
轉義序列標準形式功能描述
\繼續
\nNL回車換行
\tHT水平製表符
\bBS後退一格
\rCR回車不換行
\fFF換頁
\”單引號
\\\反斜杠
\””雙引號
\ddd0ddd八進位模式
\xddd0xddd十六進位模式
\udddd0xddddUnicode雙位元組字元
字元串常量
字元串常量是由雙引號引起來的一系列字元,與C/C++語言中不同的是,Java語言中的字元串不是通過字元數組來實現的,而是通過字元串類(即String類)來實現的。
四、變數和數據類型
在Java中,數據的類型可以分為四種:基本數據類型、數組類型、類和介面類型。任何數據都一定是上述數據類型的一種。
其中基本數據類型可以分為四大類:布爾型、字元型、整數型和浮點型。這些類型的數據與前面介紹的常量的類型基本相同,在此不再多說。下面將整數型和浮點型變數的取值範圍列出:
表一、
類型寬度取值範圍
byte8位-256到256
short16位-32768到32767
int32位-2147483648到2147483647
long64位-9223372036854775808到9223372036854775807
表二、
進位整數長整數
十進位最大正整數2147483647(2的31次方減1)923372036854775807L(2的63次方減1)
八進位最大正整數077777777777(2的31次方減1)07777777777777777777L(2的63次方減1)
最小負整數020000000000(-2的31次方)04000000000000000000L(-2的63次方)
十六進位最大正整數0x7fffffff(2的31次方減1)0x7fffffffffffffffL(2的63次方減1)
最小負整數0x80000000(-2的31次方)0x8000000000000000L(-2的63次方)
浮點數能表示的數值從小到大分別是:負無窮大、負有限值、負零、正零、正有限值及正無窮大。其中正零和負零在進行數值比較的時候是相等的,但仍有辦法分辨這兩個值,例如在進行1.0/0.0的時候會得到正無窮大的結果。其它非零非無窮大的有限值是以s*m*(2^e)來表示的,s和m的取值範圍見下表:
表三、
類型sme
float+1或-1小於2的24次方的正整數149到104的整數
double+1或-1小於2的53次方的正整數1045到1000的整數
表四、float最大值3640282347e+38f
非零最小值1.40239846e-45f
double最大值1.79769313486231570e+308
非零最小值4.940656458412465334e-324
另外浮點數還有一些特殊值,見下表:float最大值Float.MAX_VALUE
最小值Float.MIN_VALUE
正無窮大Float.POSITIVE_INFINITY
負無窮大Float.NEGATIVE_INFINITY
NaNFloat.NaN
double最大值Double.MAX_VALUE
最小值Double.MIN_VALUE
正無窮大Double.POSITIVE_INFINITY
負無窮大Double.NEGATIVE_INFINITY
NaNDouble.NaN
與C/C++語言中不同的是,在Java語言中,所有的基本數據類型都有預設值,就是說當我們聲明一個變數時,即使我們沒有對它賦值,它的值也是一定的,而不像在C/C++中那樣是不可預測的。具體個類型的預設值見下表:
基本數據類型預設值
Booleanfalse
Char’\u000′
Byte(byte)0
Short(short)0
Int0
Long0L
Float0.0L
Double0.0d
五、Java與C/C++的比較
由於Java的語法直接來源於C/C++,所以Java的程序控制語句與C/C++一模一樣,在此不再多說。以下重點介紹一下Java與C/C++的不同。
指針
大家在使用C語言編程的時候想必都曾經因為指針的複雜計算而煩惱,在C/C++語言編程過程中,指針可能引起許多錯誤,這些複雜的指針演算法所產生的錯誤常常讓人迷惑不解,導致C/C++程序員在此浪費了大量的時間。考慮到這種原因,Java中取消了指針。指針的功能由參考(reference)所取代,這使得Java中對複雜數據結構的實現更加容易,因為用對象和對象數組實現複雜的數據結構更可靠。
函數
在Java中沒有C/C++中應用廣泛的函數,C/C++中通過函數實現的功能在Java中都是通過類和方法來實現的。
繼承
C++支持多重繼承,這是一個從多個父類中派生一個類的有效辦法,但這種派生很複雜,也很容易產生問題。因此,Java中沒有採用多重繼承,但Java的ObjectiveC協議介面能完成C++中多重繼承的所有功能。
goto語句
大家知道,在使用高級語言編程時過多的使用goto語句會使程序變得十分混亂,因此Java中也沒有使用goto語句。但是不可否認,當程序比較容易控制的時候,適當使用goto語句能使程序的運行更快捷,因此Java中使用了多重break和continue語句(允許break和continue語句使用標籤)實現C++種goto語句的功能。
聯合和結構
在C++中有三種數據結構:聯合、結構和類;Java中只有類,它可以實現上述三者的功能。
字元串
在C/C++中,字元串是通過字元數組實現的,但是由於數組的空間不是動態分配的,這容易出現越界錯誤,例如:常有預先設定的字元數組不能容納後輸入的字元串。在Java中,字元串是一類特定的對象,這使得字元串更具有一致性和可預見性。
Typedef、Define和預處理器
Java中不需要#define語句、預處理器或者typedef,但需要頭文件。在Java中一個類的信息必須包含在一個文件中,而C/C++中有關類的信息可能分散在多個文件中。
java如何調用c語言源文件並進行執行?
要在java中調用c語言的庫,需要使用Java提供了JNI。\x0d\x0a舉例說明\x0d\x0a在c語言中定義一個 void sayHello()函數(列印Hello World);然後在Java中調用這個函數顯示Hello Word.\x0d\x0a現在分別從Java和C語言兩部分說明:\x0d\x0a1. Java 部分\x0d\x0a首先定義一個HelloNative,在其中申明sayHello函數,函數要申明為Native 類型的.如下:\x0d\x0apublic class HelloNative {\x0d\x0apublic native void sayHello();\x0d\x0a}\x0d\x0a\x0d\x0a編譯這個類,生成class文件:\x0d\x0ajavac HelloWorld.java\x0d\x0a\x0d\x0a利用javah生成需要的h文件\x0d\x0ajavah HelloNative\x0d\x0a\x0d\x0a生成的 h文件大概如下:\x0d\x0a\x0d\x0a/* DO NOT EDIT THIS FILE – it is machine generated */\x0d\x0a#include \x0d\x0a/* Header for class HelloNative */\x0d\x0a\x0d\x0a#ifndef _Included_HelloNative\x0d\x0a#define _Included_HelloNative\x0d\x0a#ifdef __cplusplus\x0d\x0aextern “C” {\x0d\x0a#endif\x0d\x0a/*\x0d\x0a* Class: HelloNative\x0d\x0a* Method: sayHello\x0d\x0a* Signature: ()V\x0d\x0a*/\x0d\x0aJNIEXPORT void JNICALL Java_HelloNative_sayHello\x0d\x0a(JNIEnv *, jobject);\x0d\x0a\x0d\x0a#ifdef __cplusplus\x0d\x0a}\x0d\x0a#endif\x0d\x0a#endif\x0d\x0a\x0d\x0a可以看一下上面自動生成的程序,程序include了jni.h,這個頭文件在 $JAVA_HOME下的include文件夾下. 還可以發現生成的函數名是在之前的函數名前面加上了Java_HelloNative。\x0d\x0a2. C語言部分\x0d\x0a根據上面生成的h文件編寫相應的代碼實現,建立一個 HelloNative.cpp用來實現顯示Hello World的函數.如下:\x0d\x0a\x0d\x0a#include \x0d\x0a#include “HelloNative.h”\x0d\x0a\x0d\x0aJNIEXPORT void JNICALL Java_HelloNative_sayHello(JNIEnv *, jobject)\x0d\x0a{\x0d\x0aprintf(“Hello World!\n”);\x0d\x0a}\x0d\x0a\x0d\x0a代碼編寫完成之後,我們再用gcc編譯成庫文件,命令如下;\x0d\x0agcc -fPIC -I/usr/lib/jvm/java-7-openjdk-i386/include -I/usr/lib/jvm/java-7-openjdk-i386/include/linux -shared -o libHelloNative.so HelloNative.cpp\x0d\x0a\x0d\x0a這樣就會在當前目錄下生成一個libHelloNative.so的庫文件.這時需要的庫已經生成,在C語言下的工作已經完成了.\x0d\x0a接下來需要在Java中編寫一個程序測試一下.在程序前,需要將我們的庫載入進去.載入的方法是調用Java的 System.loadLibrary(“HelloNative”);\x0d\x0a\x0d\x0apublic class TestNative\x0d\x0a{\x0d\x0astatic {\x0d\x0atry {\x0d\x0aSystem.loadLibrary(“HelloNative”);\x0d\x0a}\x0d\x0acatch(UnsatisfiedLinkError e) {\x0d\x0aSystem.out.println( “Cannot load hello library:\n ” + e.toString() );\x0d\x0a}\x0d\x0a}\x0d\x0apublic static void main(String[] args) {\x0d\x0aHelloNative test = new HelloNative();\x0d\x0atest.sayHello();\x0d\x0a}\x0d\x0a}\x0d\x0a\x0d\x0a但是再編譯後,運行的時候,問題又出現了.\x0d\x0aCannot load hello library:\x0d\x0ajava.lang.UnsatisfiedLinkError: no HelloNative in java.library.path\x0d\x0aException in thread “main” java.lang.UnsatisfiedLinkError: HelloNative.sayHello()V\x0d\x0aat HelloNative.sayHello(Native Method)\x0d\x0aat TestNative.main(TestNative.java:13)\x0d\x0a\x0d\x0a載入庫失敗,但是庫明明就是放在當前文件夾下的,怎麼會載入失敗呢?\x0d\x0a用System.getProperty(“java.library.path”)查看,發現java.library.path中並不u存在當前的目錄.主要有以下的幾個解決辦法:\x0d\x0a1) 將生成的庫複製到java.library.path有的路徑中去,當然這樣不是很好\x0d\x0a2) 設置環境變數export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH ,將當前的目錄加入到LD_LIBRARY_PATH中\x0d\x0a3) 設置java 的選項,將當前的目錄加入到其中 .java -Djava.library.path=. $LD_LIBRARY_PATH\x0d\x0a這樣之後程序就能夠成功的運行了.可以看見顯示的”Hello World!”了
Java如何調用C語言代碼 ?
Java Native Interface(JNI)是Java語言的本地編程介面,是J2SDK的一部分。在java程序中,我們可以通過JNI實現一些用java語言不便實現的功能。通常有以下幾種情況我們需要使用JNI來實現。 標準的java類庫沒有提供你的應用程序所需要的功能,通常這些功能是平台相關的 你希望使用一些已經有的類庫或者應用程序,而他們並非用java語言編寫的 程序的某些部分對速度要求比較苛刻,你選擇用彙編或者c語言來實現並在java語言中調用他們 下面我們開始編寫HelloWorld程序,由於涉及到要編寫c/c++代碼因此我們會在開發中使用Microsoft VC++工具。編寫java代碼,我們在硬碟上建立一個hello目錄作為我們的工作目錄,首先我們需要編寫自己的java代碼,在java代碼中我們會聲明native方法,代碼非常簡單。如下所示 class HelloWorld { public native void displayHelloWorld(); static { System.loadLibrary(“hello”); } public static void main(String[] args) { new HelloWorld().displayHelloWorld(); } } 注意我們的displayHelloWorld()方法的聲明,它有一個關鍵字native,表明這個方法使用java以外的語言實現。方法不包括實現,因為我們要用c/c++語言實現它。注意System.loadLibrary(“hello”)這句代碼,它是在靜態初始化塊中定義的,系統用來裝載hello共享庫,這就是我們在後面生成的hello.dll(如果在其他的操作系統可能是其他的形式,比如hello.so) 編譯java代碼 javac HelloWorld.java 生成HelloWorld.class文件 創建.h文件 這一步中我們要使用javah命令生成.h文件,這個文件要在後面的c/c++代碼中用到,我們運行 javah HelloWorld。這樣我們可以看到在相同目錄下生成了一個HelloWorld.h文件,文件內容如下 在此我們不對他進行太多的解釋。 /* DO NOT EDIT THIS FILE – it is machine generated */ #include jni.h /* Header for class HelloWorld */ #ifndef _Included_HelloWorld #define _Included_HelloWorld #ifdef __cplusplus extern “C” { #endif /* * Class: HelloWorld * Method: displayHelloWorld * Signature: ()V */ JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif 編寫本地實現代碼 在這部分我們要用C/C++語言實現java中定義的方法,我們在VC++中新建一個Project,然後創建一個HelloWorldImp.cpp文件,內容如下 #include jni.h #include “HelloWorld.h” #include stdio.h JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj) { printf(“Hello world!\n”); return; } 注意我們這裡include了 jni.h和剛才得到的HelloWorld.h文件。因此你要在VC++裡面設置好,jni.h在JAVA_HOME/include裡面。編譯通過後再生成hello.dll文件。 運行java程序 把上面生成的hello.dll文件複製到我們的工作目錄,這時候我們的目錄中包括HelloWorld.java,HelloWorld.class和hello.dll文件。運行java HelloWorld命令,則可在控制台看到Hello world| 的輸出了。運行VC++; 文件---新建---選「win32 console application」(控制台程序)---在右方設置好路徑並輸入工程名---確定 接下來的幾個提示框點確定就行了,那是提示是否要用VC++提供的框架之類的 在左邊的工作空間中選「FILEVIEW」標籤項,點開「+」號,右鍵點擊「SOURCE FILES」,選「添加文件到目錄」,此即添加你要建立的C++源程序文件,會提示你沒有文件,是否添加,你點是,輸入文件名保存就OK了 然後SOURCE FILES下就出現了你剛才建立的*.CPP文件,雙擊,輸入代碼. 以下就是點」組建」菜單中的」編譯」、」組建」等命令進行調試了。 相信你會了。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/156519.html