java使用c代碼實現(xiàn) java調(diào)用c++代碼

Java如何調(diào)用C代碼--(Linux下實現(xiàn)Java本地方法)

libMyNative.so:MyNative.o makefile gcc -Wall -rdynamic -shared -o libMyNative.so MyNative.o   MyNative.o:MyNative.c MyNative.h gcc -Wall -c MyNative.c -I./ -I/sandbox/JAVA2S/jdk1.6.0_16/include -I/sandbox/JAVA2S/jdk1.6.0_16/include/linuxcl:rm -rf *.o *.so libMyNative.so:MyNative.o makefile gcc -Wall -rdynamic -shared -o libMyNative.so MyNative.o  MyNative.o:MyNative.c MyNative.h gcc -Wall -c MyNative.c -I./ -I/sandbox/JAVA2S/jdk1.6.0_16/include -I/sandbox/JAVA2S/jdk1.6.0_16/include/linuxcl:rm -rf *.o *.so 其中,“/sandbox/JAVA2S/jdk1.6.0_16”為JDK安裝目錄 “l(fā)ibMyNative.so”是Java類中static {System.loadLibrary("MyNative");}靜態(tài)方法中參數(shù)+lib 五、修改.bash_profile文件,配置環(huán)境變量,由于生成的.so文件在當前目錄下,故 .bash_profile文件設(shè)置如下 export LD_LIBRARY_PATH=./ 六、執(zhí)行java MyNative命令,結(jié)果如下

創(chuàng)新互聯(lián)是一家專注網(wǎng)站建設(shè)、網(wǎng)絡(luò)營銷策劃、重慶小程序開發(fā)、電子商務(wù)建設(shè)、網(wǎng)絡(luò)推廣、移動互聯(lián)開發(fā)、研究、服務(wù)為一體的技術(shù)型公司。公司成立十多年以來,已經(jīng)為1000+不銹鋼雕塑各業(yè)的企業(yè)公司提供互聯(lián)網(wǎng)服務(wù)?,F(xiàn)在,服務(wù)的1000+客戶與我們一路同行,見證我們的成長;未來,我們一起分享成功的喜悅。

java可以實現(xiàn)c語言的模板功能嗎

1、java是純面向?qū)ο蟮恼Z言(main都是寫到類里的),所以沒有原生的模板功能。

2、使用“模板模式”可以實現(xiàn)類似的效果,這也是java里最常用的模式之一。

以下是一篇教程:

模板方法模式的結(jié)構(gòu)

模板方法模式是所有模式中最為常見的幾個模式之一,是基于繼承的代碼復(fù)用的基本技術(shù)。

模板方法模式需要開發(fā)抽象類和具體子類的設(shè)計師之間的協(xié)作。一個設(shè)計師負責給出一個算法的輪廓和骨架,另一些設(shè)計師則負責給出這個算法的各個邏輯步驟。代表這些具體邏輯步驟的方法稱做基本方法(primitive method);而將這些基本方法匯總起來的方法叫做模板方法(template method),這個設(shè)計模式的名字就是從此而來。

模板方法所代表的行為稱為頂級行為,其邏輯稱為頂級邏輯。模板方法模式的靜態(tài)結(jié)構(gòu)圖如下所示:

這里涉及到兩個角色:

抽象模板(Abstract Template)角色有如下責任:

■定義了一個或多個抽象操作,以便讓子類實現(xiàn)。這些抽象操作叫做基本操作,它們是一個頂級邏輯的組成步驟。

■定義并實現(xiàn)了一個模板方法。這個模板方法一般是一個具體方法,它給出了一個頂級邏輯的骨架,而邏輯的組成步驟在相應(yīng)的抽象操作中,推遲到子類實現(xiàn)。頂級邏輯也有可能調(diào)用一些具體方法。

具體模板(Concrete Template)角色又如下責任:

■實現(xiàn)父類所定義的一個或多個抽象方法,它們是一個頂級邏輯的組成步驟。

■每一個抽象模板角色都可以有任意多個具體模板角色與之對應(yīng),而每一個具體模板角色都可以給出這些抽象方法(也就是頂級邏輯的組成步驟)的不同實現(xiàn),從而使得頂級邏輯的實現(xiàn)各不相同。

源代碼

抽象模板角色類,abstractMethod()、hookMethod()等基本方法是頂級邏輯的組成步驟,這個頂級邏輯由templateMethod()方法代表。

public?abstract?class?AbstractTemplate?{

/**

*?模板方法

*/

public?void?templateMethod(){

//調(diào)用基本方法

abstractMethod();

hookMethod();

concreteMethod();

}

/**

*?基本方法的聲明(由子類實現(xiàn))

*/

protected?abstract?void?abstractMethod();

/**

*?基本方法(空方法)

*/

protected?void?hookMethod(){}

/**

*?基本方法(已經(jīng)實現(xiàn))

*/

private?final?void?concreteMethod(){

//業(yè)務(wù)相關(guān)的代碼

}

}

具體模板角色類,實現(xiàn)了父類所聲明的基本方法,abstractMethod()方法所代表的就是強制子類實現(xiàn)的剩余邏輯,而hookMethod()方法是可選擇實現(xiàn)的邏輯,不是必須實現(xiàn)的。

public?class?ConcreteTemplate?extends?AbstractTemplate{

//基本方法的實現(xiàn)

@Override

public?void?abstractMethod()?{

//業(yè)務(wù)相關(guān)的代碼

}

//重寫父類的方法

@Override

public?void?hookMethod()?{

//業(yè)務(wù)相關(guān)的代碼

}

}

模板模式的關(guān)鍵是:子類可以置換掉父類的可變部分,但是子類卻不可以改變模板方法所代表的頂級邏輯。

每當定義一個新的子類時,不要按照控制流程的思路去想,而應(yīng)當按照“責任”的思路去想。換言之,應(yīng)當考慮哪些操作是必須置換掉的,哪些操作是可以置換掉的,以及哪些操作是不可以置換掉的。使用模板模式可以使這些責任變得清晰。

Java如何調(diào)用C語言代碼 ?

需要JNI(Java Native Interface)技術(shù)即,本地調(diào)用接口。

可以將C、C++、VB等其他編程語言編制的程序代碼封裝成對用戶不可見的底層class。

而在java程序中僅聲明其方法名和參數(shù)表以及返回值即可。

大致的操作過程請百度 JNI 選擇第一個搜索結(jié)果即可找到。

java調(diào)用c語言編寫的可執(zhí)行文件

C代碼寫成這種形式吧:

#includestdio.h

#includestring.h

int main(string argv[]){

char a[100];

strcpy(a,argv[0]);

}

傳入的字串字符個數(shù)不能超過100個字符,用指針可以避免這一問題,C++代碼如下:

#includeiostream

using namespace std;

typedef char *String;

int main(String argv[]){

String str;

str=argv[0];

}

Java調(diào)用代碼如下所示:

Runtime.getRuntime().exec("a.exe testString")

testString是你自己輸入的測試字串

寫一段java代碼,調(diào)用c程序,都有什么辦法

JAVA以其跨平臺的特性深受人們喜愛,而又正由于它的跨平臺的目的,使得它和本地機器的各種內(nèi)部聯(lián)系變得很少,約束了它的功能。解決JAVA對本地操作的一種方法就是JNI。

JAVA通過JNI調(diào)用本地方法,而本地方法是以庫文件的形式存放的(在WINDOWS平臺上是DLL文件形式,在UNIX機器上是SO文件形式)。通過調(diào)用本地的庫文件的內(nèi)部方法,使JAVA可以實現(xiàn)和本地機器的緊密聯(lián)系,調(diào)用系統(tǒng)級的各接口方法。

簡單介紹及應(yīng)用如下:

一、JAVA中所需要做的工作

在JAVA程序中,首先需要在類中聲明所調(diào)用的庫名稱,如下:

static

{

System.loadLibrary(“goodluck”);

}

在這里,庫的擴展名字可以不用寫出來,究竟是DLL還是SO,由系統(tǒng)自己判斷。

還需要對將要調(diào)用的方法做本地聲明,關(guān)鍵字為native。并且只需要聲明,而不需要具體實現(xiàn)。如下:

public

native

static

void

set(int

i);

public

native

static

int

get();

然后編譯該JAVA程序文件,生成CLASS,再用JAVAH命令,JNI就會生成C/C++的頭文件。

例如程序testdll.java,內(nèi)容為:

public

class

testdll

{

static

{

System.loadLibrary("goodluck");

}

public

native

static

int

get();

public

native

static

void

set(int

i);

public

static

void

main(String[]

args)

{

testdll

test

=

new

testdll();

test.set(10);

System.out.println(test.get());

}

}

用javac

testdll.java編譯它,會生成testdll.class。

再用javah

testdll,則會在當前目錄下生成testdll.h文件,這個文件需要被C/C++程序調(diào)用來生成所需的庫文件。

二、C/C++中所需要做的工作

對于已生成的.h頭文件,C/C++所需要做的,就是把它的各個方法具體的實現(xiàn)。然后編譯連接成庫文件即可。再把庫文件拷貝到JAVA程序的路徑下面,就可以用JAVA調(diào)用C/C++所實現(xiàn)的功能了。

接上例子。我們先看一下testdll.h文件的內(nèi)容:

/*

DO

NOT

EDIT

THIS

FILE

-

it

is

machine

generated

*/

#include

jni.h

/*

Header

for

class

testdll

*/

#ifndef

_Included_testdll

#define

_Included_testdll

#ifdef

__cplusplus

extern

"C"

{

#endif

/*

*

Class:

testdll

*

Method:

get

*

Signature:

()I

*/

JNIEXPORT

jint

JNICALL

Java_testdll_get

(JNIEnv

*,

jclass);

/*

*

Class:

testdll

*

Method:

set

*

Signature:

(I)V

*/

JNIEXPORT

void

JNICALL

Java_testdll_set

(JNIEnv

*,

jclass,

jint);

#ifdef

__cplusplus

}

#endif

#endif

在具體實現(xiàn)的時候,我們只關(guān)心兩個函數(shù)原型

JNIEXPORT

jint

JNICALL

Java_testdll_get

(JNIEnv

*,

jclass);

JNIEXPORT

void

JNICALL

Java_testdll_set

(JNIEnv

*,

jclass,

jint);

這里JNIEXPORT和JNICALL都是JNI的關(guān)鍵字,表示此函數(shù)是要被JNI調(diào)用的。而jint是以JNI為中介使JAVA的int類型與本地的int溝通的一種類型,我們可以視而不見,就當做int使用。函數(shù)的名稱是JAVA_再加上java程序的package路徑再加函數(shù)名組成的。參數(shù)中,我們也只需要關(guān)心在JAVA程序中存在的參數(shù),至于JNIEnv*和jclass我們一般沒有必要去碰它。

好,下面我們用testdll.cpp文件具體實現(xiàn)這兩個函數(shù):

#include

"testdll.h"

int

i

=

0;

JNIEXPORT

jint

JNICALL

Java_testdll_get

(JNIEnv

*,

jclass)

{

return

i;

}

JNIEXPORT

void

JNICALL

Java_testdll_set

(JNIEnv

*,

jclass,

jint

j)

{

i

=

j;

}

編譯連接成庫文件,本例是在WINDOWS下做的,生成的是DLL文件。并且名稱要與JAVA中需要調(diào)用的一致,這里就是goodluck.dll

把goodluck.dll拷貝到testdll.class的目錄下,java

testdll運行它,就可以觀察到結(jié)果了。

如何用JAVA實現(xiàn)C語言中的輸出

輸出完成了C語言printf的功能。

使用指定格式字符串和參數(shù)將格式化的字符串寫入此輸出流的便捷方法。

System.out.println("%s 考了 %d分","小明“,100);

輸出: 小明 考了 100分。

使得輸出的參數(shù)與格式分離。

當前題目:java使用c代碼實現(xiàn) java調(diào)用c++代碼
網(wǎng)站網(wǎng)址:http://muchs.cn/article40/hgeieo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航移動網(wǎng)站建設(shè)、自適應(yīng)網(wǎng)站網(wǎng)頁設(shè)計公司、微信小程序、網(wǎng)站策劃

廣告

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

手機網(wǎng)站建設(shè)