欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

java代碼編譯C語(yǔ)言 用c語(yǔ)言編譯的代碼程序

這個(gè)java代碼怎么轉(zhuǎn)換成C語(yǔ)言代碼

使用詞法分析可以簡(jiǎn)單的進(jìn)行轉(zhuǎn)換,不過問題是接口,java使用的庫(kù)類和函數(shù),c并不一定擁有,而且java運(yùn)行的方式不同(java可以說是解釋器的腳本,而c最終變成指令集),并不是簡(jiǎn)單給出一個(gè)函數(shù)調(diào)用位置就可以解決的,目前的話可以實(shí)現(xiàn)個(gè)轉(zhuǎn)化器(如果你學(xué)過編譯原理),但前提是不使用接口,或許我們可以像編譯器對(duì)string類型的支持那樣實(shí)現(xiàn)所有java的庫(kù)操作,但這顯然是雞肋,因?yàn)檫@種方法寫的java程序轉(zhuǎn)換后是很難移植的(顯然我是說硬件廠商不會(huì)為你天真的想法提供接口),并且對(duì)c風(fēng)格來說是一種極大的破壞,最后生成的代碼既沒有效率也沒有可移植性和可讀性

創(chuàng)新互聯(lián)是一家專業(yè)提供太白企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站HTML5、小程序制作等業(yè)務(wù)。10年已為太白眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站設(shè)計(jì)公司優(yōu)惠進(jìn)行中。

結(jié)論是你還不如自己實(shí)現(xiàn)一個(gè),即使你要轉(zhuǎn)化一個(gè)大游戲,這樣也有效多了

如何用java調(diào)用c語(yǔ)言編譯器實(shí)現(xiàn)在線編譯c語(yǔ)

要在java中調(diào)用c語(yǔ)言的庫(kù),需要使用Java提供了JNI。

舉例說明

在c語(yǔ)言中定義一個(gè) void sayHello()函數(shù)(打印Hello World);然后在Java中調(diào)用這個(gè)函數(shù)顯示Hello Word.

現(xiàn)在分別從Java和C語(yǔ)言兩部分說明:

1. Java 部分

首先定義一個(gè)HelloNative,在其中申明sayHello函數(shù),函數(shù)要申明為Native 類型的.如下:

public class HelloNative {

public native void sayHello();

}

編譯這個(gè)類,生成class文件:

javac HelloWorld.java

利用javah生成需要的h文件

javah HelloNative

生成的 h文件大概如下:

/* DO NOT EDIT THIS FILE - it is machine generated */

#include jni.h

/* Header for class HelloNative */

#ifndef _Included_HelloNative

#define _Included_HelloNative

#ifdef __cplusplus

extern "C" {

#endif

/*

* Class: HelloNative

* Method: sayHello

* Signature: ()V

*/

JNIEXPORT void JNICALL Java_HelloNative_sayHello

(JNIEnv *, jobject);

#ifdef __cplusplus

}

#endif

#endif

可以看一下上面自動(dòng)生成的程序,程序include了jni.h,這個(gè)頭文件在 $JAVA_HOME下的include文件夾下. 還可以發(fā)現(xiàn)生成的函數(shù)名是在之前的函數(shù)名前面加上了Java_HelloNative。

2. C語(yǔ)言部分

根據(jù)上面生成的h文件編寫相應(yīng)的代碼實(shí)現(xiàn),建立一個(gè) HelloNative.cpp用來實(shí)現(xiàn)顯示Hello World的函數(shù).如下:

#include stdio.h

#include "HelloNative.h"

JNIEXPORT void JNICALL Java_HelloNative_sayHello(JNIEnv *, jobject)

{

printf("Hello World!\n");

}

代碼編寫完成之后,我們?cè)儆胓cc編譯成庫(kù)文件,命令如下;

gcc -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

這樣就會(huì)在當(dāng)前目錄下生成一個(gè)libHelloNative.so的庫(kù)文件.這時(shí)需要的庫(kù)已經(jīng)生成,在C語(yǔ)言下的工作已經(jīng)完成了.

接下來需要在Java中編寫一個(gè)程序測(cè)試一下.在程序前,需要將我們的庫(kù)載入進(jìn)去.載入的方法是調(diào)用Java的 System.loadLibrary("HelloNative");

public class TestNative

{

static {

try {

System.loadLibrary("HelloNative");

}

catch(UnsatisfiedLinkError e) {

System.out.println( "Cannot load hello library:\n " + e.toString() );

}

}

public static void main(String[] args) {

HelloNative test = new HelloNative();

test.sayHello();

}

}

但是再編譯后,運(yùn)行的時(shí)候,問題又出現(xiàn)了.

Cannot load hello library:

java.lang.UnsatisfiedLinkError: no HelloNative in java.library.path

Exception in thread "main" java.lang.UnsatisfiedLinkError: HelloNative.sayHello()V

at HelloNative.sayHello(Native Method)

at TestNative.main(TestNative.java:13)

載入庫(kù)失敗,但是庫(kù)明明就是放在當(dāng)前文件夾下的,怎么會(huì)載入失敗呢?

用System.getProperty("java.library.path")查看,發(fā)現(xiàn)java.library.path中并不u存在當(dāng)前的目錄.主要有以下的幾個(gè)解決辦法:

1) 將生成的庫(kù)復(fù)制到j(luò)ava.library.path有的路徑中去,當(dāng)然這樣不是很好

2) 設(shè)置環(huán)境變量export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH ,將當(dāng)前的目錄加入到LD_LIBRARY_PATH中

3) 設(shè)置java 的選項(xiàng),將當(dāng)前的目錄加入到其中 .java -Djava.library.path=. $LD_LIBRARY_PATH

這樣之后程序就能夠成功的運(yùn)行了.可以看見顯示的"Hello World!"了

用Java可以寫C語(yǔ)言編譯器嗎?

用java是可以寫語(yǔ)言編譯器的,用任何語(yǔ)言工具寫都可以。 各語(yǔ)言開發(fā)工具間只有開發(fā)效率的差異,沒有可行不可行的區(qū)別。

編譯器其實(shí)就是一個(gè)翻譯工具,它可以把代碼直接翻譯成二進(jìn)制文件交給CPU執(zhí)行(二進(jìn)制指令就是CPU的指令集,當(dāng)然可以直接操作內(nèi)存),當(dāng)然,這個(gè)二進(jìn)制文件需要符合操作系統(tǒng)的可執(zhí)行文件的格式(PE格式或ELF格式)才能執(zhí)行。

換個(gè)角度理解:

linux gcc實(shí)際上就是一個(gè)工具集合,包含編譯器,匯編器,連接器等

編譯器就是把c語(yǔ)言程序翻譯為一種叫做目標(biāo)文件的中間表示形式,然后交給匯編器,翻譯為匯編程序,而匯編執(zhí)行直接對(duì)應(yīng)二進(jìn)制機(jī)器碼,鏈接之后就可以變成可執(zhí)行文件了。

而用java實(shí)現(xiàn)的編譯器完全可以代替gcc工具集合中的編譯器,生成相同的目標(biāo)文件的中間表示形式,在交給gcc匯編器,連接器等處理。

本文名稱:java代碼編譯C語(yǔ)言 用c語(yǔ)言編譯的代碼程序
分享鏈接:http://chinadenli.net/article12/dodpegc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器全網(wǎng)營(yíng)銷推廣網(wǎng)站設(shè)計(jì)虛擬主機(jī)定制網(wǎng)站企業(yè)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司