我有两个声明为以下函数,使用extern "C"
命名以避免名称修饰。
#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
最佳答案
在我看来,这两个函数的名称正确(两个函数的前面带有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