jni開發中 接口爲什麼要冠extern "C"呢

android studio jni開發默認是C++語言的,而且還都是靜態註冊
  C++爲了支持函數重載,函數在被C++編譯後在符號庫中的名字與C語言的不同。假如某個函數的原型爲void f(int x, int y);該函數被C編譯器編譯後在符號庫中的名字爲_f,而C++編譯器則會產生_f_int_int之類的名字。C++就是靠這種機制來實現函數重載的。 
  被extern “C”修飾的函數或者變量是按照C語言方式編譯和鏈接的,所以可以用一句話來概括extern “C”的真實目的是實現C++與C的混合編程。我想編譯的時候用的編譯器是C++編譯器一個編譯器吧,只是編譯器支持多種不同的編譯模式罷了,這個不是重點.

那麼,jni通過這種方式支持重載的java native函數嗎?特地做了個試驗:

public class Config {
    static {
        System.loadLibrary("native-lib");
    }
    public static native void init(int code);
    public static native void init(int code,String name);
    public static native String getSign(String json);

}

extern "C" JNIEXPORT void JNICALL
Java_com_bbc_playnativec_Config_init(JNIEnv *env, jclass clazz, jint code) {
    std::string hello = "bbc config init, C++ pppp222";
    LOGE("code=%d,%s", code, hello.data());
}

發現C++中函數出現紅線,提示錯誤不能編譯了.說到底,jni入庫還是C語言的,但本地的其他功能代碼可以使用C++語言的特性來實現.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章