Вызов статического метода AndroidJni со строковым параметром
Я пытаюсь вызвать статическую функцию Java в классе Qt C++, используя QAndroidJniObject со строковым параметром.
Это мой класс Java, имеющий функцию, которую я вызываю
public class StatusBar{
public static void setStatusBarBackgroundColor(Activity activity,String colorPref) {
// My code
}
}
Я вызываю эту функцию из C++ как
void ECApplicationInfo::changeStatusBarColor(QString color)
{
QAndroidJniObject::callStaticMethod<void>(
"com/ezeecube/ezeesync/StatusBar",
"setStatusBarBackgroundColor",
"(Landroid/app/Activity;)V",
activity,color);
}
Я получаю следующую ошибку
ошибка: невозможно передать объекты нетривиально копируемого типа 'class QString' через '...' активность, цвет);
Как я могу избавиться от этой ошибки
2 ответа
Определение вашей сигнатуры функции неверно. Вы также должны указать второй аргумент, который имеет тип Ljava/lang/String;
, Также вы должны конвертировать QString
в jstring
и передать его в качестве аргумента:
QAndroidJniObject::callStaticMethod<void>(
"com/ezeecube/ezeesync/StatusBar",
"setStatusBarBackgroundColor",
"(Landroid/app/Activity;Ljava/lang/String;)V",
activity,QAndroidJniObject::fromString(color).object<jstring>());
JNI не понимает QString
, вам нужно конвертировать его в JNI jstring
тип. QAndroidJniObject
имеет удобный статический метод для этого:
QString q = "Hello world";
QAndroidJniObject jniObject = QAndroidJniObject::fromString(q);
jstring j = jniObject.object<jstring>();
Это довольно типично, мосты JNI обычно требуют ручной сериализации между типами.
QAndroidJniObject
также предоставляет метод toString() для преобразования строки Java обратно в QString
,