先來看一段代碼,這段代碼是jni自動生成的代碼。
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class TestJni */
#ifndef _Included_TestJni
#define _Included_TestJni
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: TestJni
* Method: sayHello
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_TestJni_sayHello
(JNIEnv *, jobject, jstring);
//--kill-at
#ifdef __cplusplus
}
#endif
#endif
extern "C"
初次看有些陌生,首先我們先要明白 爲何要使用extern"C",在c++中爲了支持重載機制,在編譯生成的代碼中要對函數的名字進行處理,例如加入函數的返回類型等.而c中只是簡單的函數名而已,不會加入其它東西.試想如果已經有一個c的函數庫供我們c++調用,那麼就會找不到函數,因爲c++中我們的方法名稱已經不再是原來的名字,因此我們需要使用extern"C"告訴編譯器使用c的方式來連接他們.那麼上面出現的結果就是
如果__cplusplus定義了結果爲
extern "C" {
/*
* Class: TestJni
* Method: sayHello
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_TestJni_sayHello
(JNIEnv *, jobject, jstring);
//--kill-at
}
如果沒有定義則
/*
* Class: TestJni
* Method: sayHello
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_TestJni_sayHello
(JNIEnv *, jobject, jstring);
extern是C/C++語言中表明函數和全局變量作用範圍(可見性)的關鍵字,該關鍵字告訴編譯器,其聲明的函數和變量可以在本模塊或其它模塊中使用
總結一下:
關鍵字extern作用主要是以下兩種:
1、與“C”一起連用-------告訴編譯器在編譯函數名時按照C的規則去而不是按照C++;
2、不與"C"一起修飾變量或函數-------聲明函數或全局變臉作用範圍的關鍵字。