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

Posted

技术标签:

【中文标题】使用字符串参数调用 AndroidJni 静态方法【英文标题】:Calling AndroidJni static method with string parameter 【发布时间】: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'通过'...' 活动,颜色);

我怎样才能摆脱这个错误

【问题讨论】:

【参考方案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 你能帮忙解决一下这个***.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

【讨论】:

以上是关于使用字符串参数调用 AndroidJni 静态方法的主要内容,如果未能解决你的问题,请参考以下文章

在 expression.call 中使用参数调用静态方法

Python中的类方法实例方法静态方法

高级特性(12)- 本地方法

用预处理器替换 C++ 类/静态方法?

Android JNI——NDK与JNI基础

Java中方法调用总结