JNI-java和c互通
1、java和c是如何互通的?
其實不能互通的原因主要是資料型別的問題,jni解決了這個問題,例如那個c檔案中的jstring資料型別就是java傳入的String物件,經過jni函式的轉化就能成為c的char*。
對應資料型別關係如下表:
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
2. 如何將java傳入的String引數轉換為c的char*,然後使用?
java傳入的String引數,在c檔案中被jni轉換為jstring的資料型別,在c檔案中宣告char* test,然後test = (char*)(env)->GetStringUTFChars(jstring, NULL);
char* buff,把char型別的buf傳回去,jstring result = env->NewStringUTF(buff);
注意:
3、條件編譯
#ifdef __cplusplus (其中__cplusplus是cpp中自定義的一個巨集!!!用G++編譯器編譯這個巨集才會有定義)
extern "C"{ //告訴編譯器,這部分程式碼按C語言的格式進行編譯,而不是C++的
#endif
//程式碼部分
#ifdef __cplusplus
}
#endif
由於C++支援函式過載,而C語言不支援,因此函式被
extern "C"不加{}是怎麼使用的??加在某個函式前面或某句程式碼前面
C語言不支援extern "C"語法,如果我們想寫一個頭檔案,同時支援被C和C++引用,該怎麼辦?可以使用C++的巨集 "__cplusplus"來判斷是不是C++編譯器。