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+客戶與我們一路同行,見證我們的成長;未來,我們一起分享成功的喜悅。
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)當考慮哪些操作是必須置換掉的,哪些操作是可以置換掉的,以及哪些操作是不可以置換掉的。使用模板模式可以使這些責任變得清晰。
需要JNI(Java Native Interface)技術(shù)即,本地調(diào)用接口。
可以將C、C++、VB等其他編程語言編制的程序代碼封裝成對用戶不可見的底層class。
而在java程序中僅聲明其方法名和參數(shù)表以及返回值即可。
大致的操作過程請百度 JNI 選擇第一個搜索結(jié)果即可找到。
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以其跨平臺的特性深受人們喜愛,而又正由于它的跨平臺的目的,使得它和本地機器的各種內(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é)果了。
輸出完成了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)