【问题标题】:Calling AndroidJni static method with string parameter使用字符串参数调用 AndroidJni 静态方法
【发布时间】:2015-03-14 03:40:54
【问题描述】:

我正在尝试使用带有字符串参数的 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'通过'...' 活动,颜色);

我怎样才能摆脱这个错误

【问题讨论】:

    标签: java android c++ qt qtandroidextras


    【解决方案1】:

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

    【讨论】:

    • 如果在 androidManifest 中已修复,我可以更改 android 屏幕的方向
    • 我没有收到任何错误,但该函数也没有被调用
    • 我不知道你是如何提供activity 参数的。可能这就是问题所在。
    • @Nejat 你能帮忙解决一下这个stackoverflow.com/questions/52289447/…
    【解决方案2】:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-02
      • 2018-11-02
      • 1970-01-01
      • 1970-01-01
      • 2020-11-04
      • 2016-07-23
      相关资源
      最近更新 更多