2010-08-06 160 views
0

我有兩個函數聲明如下,使用extern "C" aming來避免名稱混亂。_GLOBAL__I_的用途是什麼?

#ifdef __cplusplus 
extern "C" { 
#endif 
JNIEXPORT jobject JNICALL Java_com_trident_tv_si_SIManagerImpl_nGetServiceDetails 
    (JNIEnv *, jobject, jint); 

JNIEXPORT jobject JNICALL Java_com_trident_tv_si_SIManagerImpl_nGetServiceCurrentEvent 
    (JNIEnv *, jobject, jint); 
#ifdef __cplusplus 
} 
#endif 
#endif 

出人意料的是,第二功能還是有錯位的名字_GLOBAL__I_Java_com_trident_tv_si_SIManagerImpl_nGetServiceCurrentEvent,我想知道什麼是它的目的和原因的第一個函數沒有產生一個?

00004d58 T Java_com_trident_tv_si_SIManagerImpl_nGetServiceCurrentEvent 
0000533a T Java_com_trident_tv_si_SIManagerImpl_nGetServiceDetails 
0000494f t _GLOBAL__I_Java_com_trident_tv_si_SIManagerImpl_nGetServiceCurrentEvent 

編輯:

在這裏找到一些。但是,還沒有明確的答案。

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=12293

回答

1

它看起來對我來說,這兩個函數具有正確的名稱(兩個以T開頭),而第三個符號(以T開頭)爲GCCS內部使用而創建的。

雖然他們已被重新排序。

// SECOND FUNCTION, T = exported and in TEXT section 
00004d58 T Java_com_trident_tv_si_SIManagerImpl_nGetServiceCurrentEvent 
// FIRST FUNCTION, T = exported and in TEXT section 
0000533a T Java_com_trident_tv_si_SIManagerImpl_nGetServiceDetails 
// INTERNAL symbol, t = non-exported symbol in TEXT section 
0000494f t _GLOBAL__I_Java_com_trident_tv_si_SIManagerImpl_nGetS