1. 程式人生 > >JNI-java和c互通

JNI-java和c互通

1javac是如何互通的?

  其實不能互通的原因主要是資料型別的問題,jni解決了這個問題,例如那個c檔案中的jstring資料型別就是java傳入的String物件,經過jni函式的轉化就能成為cchar*

  對應資料型別關係如下表:

  Java 型別 本地c型別 說明 boolean jboolean 無符號,8 byte jbyte 無符號,8 char jchar 無符號,16 short jshort 有符號,16 int jint 有符號,32 long jlong 有符號,64 float jfloat 32 double jdouble 64

void void。

2. 如何將java傳入的String引數轉換為cchar*,然後使用?

    java傳入的String引數,在c檔案中被jni轉換為jstring的資料型別,在c檔案中宣告char* test,然後test = (char*)(env)->GetStringUTFChars(jstring, NULL);

     char* buff,把char型別的buf傳回去,jstring result = env->NewStringUTF(buff);

     注意:

test使用完後,通知虛擬機器平臺相關程式碼無需再訪問:env->ReleaseStringUTFChars( jstring, test);

3、條件編譯

#ifdef __cplusplus (其中__cplusplus是cpp中自定義的一個巨集!!!用G++編譯器編譯這個巨集才會有定義)

extern "C"{  //告訴編譯器,這部分程式碼按C語言的格式進行編譯,而不是C++的

#endif

//程式碼部分

#ifdef __cplusplus

}

#endif

     由於C++支援函式過載,而C語言不支援,因此函式被

C++編譯後在符號庫中的名字是與C語言不同的;C++編譯後的函式需要加上引數的型別才能唯一標定過載後的函式,而加上extern "C"後,是為了向編譯器指明這段程式碼按照C語言的方式進行編譯

     extern "C"不加{}是怎麼使用的??加在某個函式前面或某句程式碼前面

    C語言不支援extern "C"語法,如果我們想寫一個頭檔案,同時支援被CC++引用,該怎麼辦?可以使用C++的巨集 "__cplusplus"來判斷是不是C++編譯器。