在普通的C語言里,如果想將函數或者變量使用范圍現在在當前文件,需要對其添加static修飾。但如果希望將其暴露給共享庫的指定文件,需要通過符號隱藏顯示來控制。
GCC4.0以后提供了符號可見性選項-fvisibility=vis,vis可以是默認值default、或者hidden表示隱藏。
對應的代碼可見性屬性為__attribute__((visibility("default")))或者__attribute__((visibility("hidden")))
為了簡化符號輸出形式,可以通過EXPORT簡化其寫法。如下:
#define EXPORT __attribute__((visibility("default")))
EXPORT int Func();
所以JNIEXPORT可以認為是#define JNIEXPORT __attribute__((visibility("default"))) 這樣來的,當然具體實現可能復雜些,要判斷不同編譯器等等
下面是一個具體例子:
#if defined(__GNUC__) && __GNUC__ >= 4
#define GMATH_EXPORT __attribute__((visibility("default")))
#elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590)
#define GMATH_EXPORT __attribute__((visibility("default")))
#else
#define GMATH_EXPORT
#endif
GMATH_EXPORT unsigned gpower(unsigned n) {
//
}