使用字符串参数调用 AndroidJni 静态方法

Calling AndroidJni static method with string parameter

我正在尝试使用带有字符串参数的 QAndroidJniObject 在 Qt C++ class 中调用 Java 静态函数。

这是我的 Java class 具有我正在调用的功能

        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);
}

我收到以下错误

error: cannot pass objects of non-trivially-copyable type 'class QString' through '...' activity,color);

我怎样才能摆脱这个错误

JNI不理解QString,需要转成JNI的jstring类型。 QAndroidJniObject 有一个方便的静态方法:

QString q = "Hello world";
QAndroidJniObject jniObject = QAndroidJniObject::fromString(q);
jstring j = jniObject.object<jstring>();

这很典型,JNI 桥通常需要在类型之间进行手动序列化。

QAndroidJniObject 还提供了 toString() method 用于将 Java 字符串转换回 QString.

您的函数签名定义不正确。您还应该指定类型为 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>());