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

时间:2015-03-14 03:40:54

标签: java android c++ qt qtandroidextras

我正在尝试使用带有字符串参数的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);
}

我收到以下错误

  

错误:无法传递非平凡可复制类型的类的对象   QString'通过'...'                       活性,颜色);

我怎样才能摆脱这个错误

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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