使用字符串参数调用 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 静态方法的主要内容,如果未能解决你的问题,请参考以下文章