_GLOBAL__I_的目的是什么?

时间:2010-08-06 07:33:50

标签: c++ gcc java-native-interface

我有两个声明如下的函数,使用extern "C" aming来避免名称错位。

#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 个答案:

答案 0 :(得分:1)

在我看来,两个函数具有正确的名称(前面带有T的两个),并且为gccs内部使用创建了第三个符号(前面带有t)。

他们已经重新订购了。

// 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