所以我在C ++中有一个静态函数,需要调用一个类的成员函数。显然,如果不指定成员函数所属的类的实例,则无法从静态方法调用成员函数。就我而言,该类只需要实例化一次,因此我想出了以下代码:
#include <QAndroidJniObject>
#include <QDebug>
class JavaListener : public QObject{
Q_OBJECT
public:
JavaListener() = default;
static JavaListener* getInstance(){
if (mThis == nullptr) // avoid creation of new instances
mThis = new JavaListener;
return mThis;
}
static JavaListener* mThis;
signals:
// signals can be seen as just "functions" in Qt
void messageReceived(QString const &message);
};
JavaListener* JavaListener::mThis = nullptr;
static void receiveFromJava(JNIEnv */*env*/, jobject /*obj*/, jstring message)
{
JavaListener* j = JavaListener::getInstance();
QAndroidJniObject messageObject(message);
// emit is not really necessary
emit j->messageReceived(messageObject.toString());
qDebug() << "MESSAGE FROM JAVA" << message;
}
但是我遇到以下错误:
错误:错误:对'JavaListener :: messageReceived(QString const&)'的未定义引用
在以下行中:
emit j->messageReceived(messageObject.toString());
答案 0 :(得分:0)
根据@NathanOliver的建议,我在JavaListener
类中创建了一个函数:
void onMessageReceived(QString const &message){
emit messageReceived(message);
}
,然后在我的静态方法中调用它。 (我不确定为什么不能直接发出Qt信号)。
答案 1 :(得分:0)
遵循单例代码模板并且不公开对象管理者成员,它必须是私有,因此,请执行以下操作:
private:
static JavaListener* mThis = nullptr;
然后您可以执行以下操作:
JavaListener::getInstance()->messageReceived(messageObject.toString());
答案 2 :(得分:0)
您需要先运行qmake。由此将生成信号元代码,然后信号代码将在那里。那么还应该解决未定义的符号问题。
在Qt-Creator中,只需尝试“ 运行QMake ”。