1

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

这是我正在调用的具有函数的 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'的对象);

我怎样才能摆脱这个错误

4

2 回答 2

4

您的函数签名的定义不正确。您还应该指定类型为 的第二个参数Ljava/lang/String;。您还应该转换QStringjstring并将其作为参数传递:

QAndroidJniObject::callStaticMethod<void>( 
                  "com/ezeecube/ezeesync/StatusBar",
                  "setStatusBarBackgroundColor",
                  "(Landroid/app/Activity;Ljava/lang/String;)V",
                   activity,QAndroidJniObject::fromString(color).object<jstring>());
于 2015-03-14T04:57:25.663 回答
1

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

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

这是相当典型的,JNI 桥通常需要类型之间的手动序列化。

QAndroidJniObject还提供了一个toString() 方法,用于将 Java 字符串转换回QString.

于 2015-03-14T04:37:33.117 回答