Вызов статического метода 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,

Другие вопросы по тегам