-Wpmf-conversions与段错误
下面这段代码,是取自一个安卓应用程序项目,用来向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.
JNINativeMethod methods[] ,这个里面注册的东西,要求是一个个的函数,对于 由 类所提供的函数,则要求其为静态函数。 而前面代码中注册的reportVersion ,并不是一个静态函数,它只是一个实例函数 。
void reportVersion( JNIEnv * env, jobject thiz , jstring applicationVersion); //!<报告应用程序版本号。
Wpmf-conversions警告也表明了这一点,它的意思是, 在本来应当传入 (普通或静态) 函数指针 的地方,却传入了一个指向成员函数的指针。
将 reportVersion函数声明成静态函数 ,即可解决这个问题。
static void reportVersion( JNIEnv * env, jobject thiz , jstring applicationVersion); //!<报告应用程序版本号。
- Wpmf-conversions警告的意思就是说,某个 地方预期传入的是一个(普通或静态)函数指针,而妳却在代码里传入了一个 (非静态)成员函数指针 ,于是就引发了这样一个警告。
作为一个 非静态成员函数,在被调用时, 要求传入一个隐式的this指针 ,才能够正常执行。 而 在运行 时, 妳所传入的 这个非静态成员函数指针 被当成普通函数来 调 用 , 这样,就没有按照非静态成员函数的要求来传入隐式的this指针,事实上在jni这样的运行环境下也确实不存在可传入的this指针,因为根本就没有创建对应的对象。
这 样,在运行时,就会发生段错误而崩溃了。
Your opinions
HxLauncher: Launch Android applications by voice commands