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

java靜態(tài)代碼庫 java 動(dòng)態(tài)編譯和靜態(tài)編譯

Java的構(gòu)造代碼塊和靜態(tài)代碼塊的區(qū)別

靜態(tài)代碼塊在類加載時(shí)執(zhí)行,用于初始化類的一些信息。

成都創(chuàng)新互聯(lián)長(zhǎng)期為1000多家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為臨城企業(yè)提供專業(yè)的成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì),臨城網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。

構(gòu)造代碼塊在相應(yīng)構(gòu)造方法被調(diào)用時(shí)執(zhí)行,用于對(duì)象的初始化。

java 如何調(diào)用一個(gè)已經(jīng)存在的靜態(tài)庫,并輸入和獲取參數(shù)! 例如:靜態(tài)庫中已經(jīng)存在函數(shù) ret=ys_tpcall(aa);

給出一個(gè)windows下dll的實(shí)例。linux下.a的靜態(tài)庫只是頭文件和編譯有所不同,另外需要將編譯后的動(dòng)態(tài)庫文件放入/usr/lib下,使用ldconfig載入。

一 先制作一個(gè)系統(tǒng)中有的DLL文件(cpp給出的sdk接口)

既然是測(cè)試我們就把我們這個(gè)dll叫做testDll吧,為了簡(jiǎn)單其間,我只寫一個(gè)add方法,就是簡(jiǎn)單的2個(gè)數(shù)字相加,對(duì)于真正的開發(fā)中我們肯定會(huì)遇到其他類型,java到c/cpp中類型需要轉(zhuǎn)換,具體類型轉(zhuǎn)換對(duì)應(yīng)關(guān)系g一下就能得到,我也不在列舉。c/cpp中一個(gè)class一般包含2個(gè)文件,一個(gè)頭文件定義(*.h),一個(gè)文件主體(*.c/*.cpp)。啰嗦了這么多還是直接動(dòng)手吧,先在vs2008中建立一個(gè)工程(當(dāng)然你也可以直接編寫不用這些IDE工具,gcc g++的命令自己g。下同,不在注釋不在廢話),選取win32工程

鍵入工程名字testDll,點(diǎn)擊next選取DLL,然后點(diǎn)擊完成

打開我們的testdll.cpp,添加進(jìn)我們的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,因?yàn)槲覀円o出調(diào)用者一個(gè)接口,如果不給頭文件,人家就沒辦法調(diào)用,所以我們就必須添加一個(gè)頭文件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

在這個(gè)頭文件中我們把我們的add方法給定義了進(jìn)去。注意到testdll.cpp中#include "stdafx.h",所以我們就把這個(gè)testDll.h include進(jìn)stdafx.h里面。

按道理說我們的這個(gè)dll已經(jīng)完成了,但是一般c/cpp給接口SDK的時(shí)候大都給.h和.lib,為了一步生成dll和lib,我們添加進(jìn)一個(gè)testDll.def,有了這個(gè)文件就可以一步生成dll和lib。在source file里右鍵add new item ,選擇Module-Definition File

鍵入testDll,OK了,我們可以直接build了。生成testDll.dll和testDll.lib。

把testDll.dll扔到system32目錄里等待我們高大威猛的java jni調(diào)用。

二 JNI

2.1 編寫java文件

為了顯示我們的與眾相同,我們就把我們的這個(gè)java文件命名為Demo.java順便直接帶上包名

,因?yàn)槲覀冎廊思医o我們的接口里有個(gè)add方法,所以我們就直接來個(gè)調(diào)用吧。

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代碼暫時(shí)如此,我們把將要生成的jni的dll叫做jniDll,有童鞋講,我不想用你這個(gè)爛名字jniDll多俗啊,沒關(guān)系,你可以換,隨你換,生成文件后你再換也可以,現(xiàn)在換也可以。

2.2 生成.h頭文件

javah命令,不多講。生成的文件com_testJni_testDemo_Demo.h這個(gè)文件的命名規(guī)則我就不多講了,一目了然。

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實(shí)現(xiàn)這個(gè)頭文件

c/cpp中已經(jīng)實(shí)現(xiàn)了這個(gè)add方法,我們只需要調(diào)用就可以啦。所以直接vs2008中建立一個(gè)dll工程,工程名我們就叫jniDll,具體過程不再多講,方法同上面testDll的建立一樣。在這個(gè)工程里kimmking把需要引用的包、文件等已經(jīng)講的很清楚了。打開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);

}因?yàn)閕nt對(duì)應(yīng)的類型就剛好是jint,所以就不需要轉(zhuǎn)換,其他需要轉(zhuǎn)換的類型自己g對(duì)應(yīng)關(guān)系轉(zhuǎn)換,注意釋放。

這個(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"

在編譯這個(gè)jniDll工程的時(shí)候需要引入testDll.h,com_testJni_testDemo_Demo.h,另外添加testDll.lib這個(gè)依賴。

好了做好這些后,build下,生成了我們期待已久的jniDll.dll,把這個(gè)dll同樣扔到system32下。

三 測(cè)試

本人特懶,不想寫多余的class,所以直接修改Demo.java 這也是剛才為什么講暫時(shí)如此的原因

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));

}

}

四 最后補(bǔ)充

如果系統(tǒng)已經(jīng)加載過c/cpp的dll,我們就不用再System.loadLibrary("testDll")了,加載一遍就可以了,因?yàn)槲覀儎偛艑懙膖estDll系統(tǒng)沒有加載,所以我就加載了一下。對(duì)于多個(gè)dll可以寫多個(gè)System.loadLibrary去加載,修改static{}里面的內(nèi)容不需要重新生成dll,除非你多加了一個(gè)調(diào)用方法,如果你看清楚規(guī)則,就不用javah命令就可以直接編寫頭文件,用javah太麻煩了。

java 靜態(tài)代碼塊 靜態(tài)方法

一般情況下,如果有些代碼必須在項(xiàng)目啟動(dòng)的時(shí)候就執(zhí)行的時(shí)候,需要使用靜態(tài)代碼塊,這種代碼是主動(dòng)執(zhí)行的;需要在項(xiàng)目啟動(dòng)的時(shí)候就初始化,在不創(chuàng)建對(duì)象的情況下,其他程序來調(diào)用的時(shí)候,需要使用靜態(tài)方法,這種代碼是被動(dòng)執(zhí)行的.

兩者的區(qū)別就是:靜態(tài)代碼塊是自動(dòng)執(zhí)行的;

靜態(tài)方法是被調(diào)用的時(shí)候才執(zhí)行的.

作用:靜態(tài)代碼塊可用來初始化一些項(xiàng)目最常用的變量或?qū)ο?靜態(tài)方法可用作不創(chuàng)建對(duì)象也可能需要執(zhí)行的代碼.

java中靜態(tài)代碼塊和構(gòu)造代碼塊的區(qū)別

直接在類中定義且沒有加static關(guān)鍵字的代碼塊稱為{}構(gòu)造代碼塊。構(gòu)造代碼塊在創(chuàng)建對(duì)象時(shí)被調(diào)用,每次創(chuàng)建對(duì)象都會(huì)被調(diào)用,并且構(gòu)造代碼塊的執(zhí)行次序優(yōu)先于類構(gòu)造函數(shù)。

靜態(tài)代碼塊:在java中使用static關(guān)鍵字聲明的代碼塊。靜態(tài)塊用于初始化類,為類的屬性初始化。每個(gè)靜態(tài)代碼塊只會(huì)執(zhí)行一次。由于JVM在加載類時(shí)會(huì)執(zhí)行靜態(tài)代碼塊,所以靜態(tài)代碼塊先于主方法執(zhí)行。

注意:1 靜態(tài)代碼塊不能存在于任何方法體內(nèi)。2 靜態(tài)代碼塊不能直接訪問靜態(tài)實(shí)例變量和實(shí)例方法,需要通過類的實(shí)例對(duì)象來訪問。

網(wǎng)站名稱:java靜態(tài)代碼庫 java 動(dòng)態(tài)編譯和靜態(tài)編譯
文章網(wǎng)址:http://chinadenli.net/article42/doojhhc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站用戶體驗(yàn)商城網(wǎng)站搜索引擎優(yōu)化自適應(yīng)網(wǎng)站定制網(wǎng)站

廣告

聲明:本網(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è)