StupidBeauty
Read times:2993Posted at: - no title specified

-Wpmf-conversions与段错误

内容目录

1问题

2原因

3修复

4理论

1 问题

下面这段代码,是取自一个安卓应用程序项目,用来向jni系统注册一个函数,以在java代码中调用。

/*!

* \brief OrControllerBridge::registerNativeMethods register native methods.

*/

void OrControllerBridge ::registerNativeMethods()

{

#ifdef Q_OS_ANDROID

JNINativeMethod methods[]

{

{ const_cast < char *>( "nativeReportVersion" ), const_cast < char *>( "(Ljava/lang/String;)V" ), reinterpret_cast < void *>(& OrControllerBridge ::reportVersion)},

};

QAndroidJniObject javaClass( "com/stupidbeauty/comgooglewidevinesoftwaredrmremover/OrControllerBridge" );

QAndroidJniEnvironment env;

jclass objectClass=env->GetObjectClass (javaClass.object< jobject >());

env->RegisterNatives (objectClass,methods, sizeof (methods)/ sizeof (methods[ 0 ]));

env->DeleteLocalRef (objectClass);

#endif //Q_OS_ANDROID

return ;

} //void OrControllerBridge::registerNativeMethods()

编译时,会遇到警告:

/Data/SoftwareDevelop/comgooglewidevinesoftwaredrmremover/OptimizeRepair/OrControllerBridge.cpp:49: warning: converting from 'void (OrControllerBridge::*)(JNIEnv*, jobject, jstring) {aka void (OrControllerBridge::*)(_JNIEnv*, _jobject*, _jstring*)}' to 'void*' [-Wpmf-conversions]

         {const_cast<char*>("nativeReportVersion"),const_cast<char*>("(Ljava/lang/String;)V"),reinterpret_cast<void*>(&OrControllerBridge::reportVersion)},

                                                                                                                                                        ^

忽略该警告,将程序放到安卓手机上运行的话,会产生段错误,导致程序崩溃:

"com.stupidbeauty.comgooglewidevinesoftwaredrmremover" died.

2 原因

JNINativeMethod methods[] ,这个里面注册的东西,要求是一个个的函数,对于 类所提供的函数,则要求其为静态函数。 而前面代码中注册的reportVersion ,并不是一个静态函数,它只是一个实例函数

void reportVersion( JNIEnv * env, jobject thiz , jstring applicationVersion); //!<报告应用程序版本号。

Wpmf-conversions警告也表明了这一点,它的意思是, 在本来应当传入 (普通或静态) 函数指针 的地方,却传入了一个指向成员函数的指针。

3 修复

reportVersion函数声明成静态函数 ,即可解决这个问题。

static void reportVersion( JNIEnv * env, jobject thiz , jstring applicationVersion); //!<报告应用程序版本号。

4 理论

- Wpmf-conversions警告的意思就是说,某个 地方预期传入的是一个(普通或静态)函数指针,而妳却在代码里传入了一个 (非静态)成员函数指针 ,于是就引发了这样一个警告。

作为一个 非静态成员函数,在被调用时, 要求传入一个隐式的this指针 ,才能够正常执行。 在运行 时, 妳所传入的 这个非静态成员函数指针 被当成普通函数来 这样,就没有按照非静态成员函数的要求来传入隐式的this指针,事实上在jni这样的运行环境下也确实不存在可传入的this指针,因为根本就没有创建对应的对象。

样,在运行时,就会发生段错误而崩溃了。

Your opinions

Your name:Email:Website url:Opinion content:
Recent comments
2017年4月~2019年4月垃圾短信排行榜Posted at:Thu Sep 26 04:51:48 2024
Qt5.7文档翻译:QWebEngineCookieStore类,QWebEngineCookieStore ClassPosted at:Fri Aug 11 06:50:35 2023盲盒kill -9 18289 Grebe.20230517.211749.552.mp4