2014-02-08 63 views
3

我想调用一个方法在c + + qt中使用QAndroidJniObject在android活动中定义。 这是我在C调用++类从qt调用java方法从c +

QAndroidJniObject data = QAndroidJniObject::callStaticObjectMethod("com/android/app/appActivity", 
                     "appData", 
                     "(I)Ljava/lang/String;"); 
QString dataValue = data.toString(); 
qDebug() <<"Data is " << dataValue; 

这个应用程序数据在appActiviy安卓类中定义的,它返回一个字符串 这种定义方法,我要打电话,并得到返回的字符串值

static String appData(){ 
    Log.d("App Data is ", "Working"); 
    return data; 
} 

但是我得到的是dataValue,它不会抛出任何错误。

+0

'dataVale'和'dataValue'不匹配。(可能只是一个转录错误?) –

+0

它应该给我语法错误...但我检查它并非如此 –

回答

0

谢谢你们的回答,最后我想通了。这是简单的方式,然后我试图

QAndroidJniObject data = QAndroidJniObject::callStaticObjectMethod("com/android/app/appActivity", 
                    "appData", 
                    "(I)Ljava/lang/String;"); 

在这段代码我不知道这意味着(I)Ljava/lang/String;你的Java方法接受参数的类型,但在我的情况下,什么都没有。所以正确答案是

QAndroidJniObject data = QAndroidJniObject::callStaticObjectMethod<jstring>("com/android/app/appActivity", 
                    "appData")` 

表示我定义的java方法的返回类型。 我想这是从我的结尾愚蠢的错误...再次感谢

+1

这就是我在2.在我的答案中所说的。很高兴你想出来了。你也可以使用签名:“()Ljava/lang/String;” – Phat

3

您可能需要手动检查异常以获取Java错误。

Qt documentation

处理Java异常

当调用可能抛出异常的Java功能,您检查,处理,并在继续之前清除异常是很重要的。

注意:当有异常待处理时进行JNI调用是不安全的。

void functionException() 
{ 
    QAndroidJniObject myString = QAndroidJniObject::fromString("Hello"); 
    jchar c = myString.callMethod<jchar>("charAt", "(I)C", 1000); 
    QAndroidJniEnvironment env; 
    if (env->ExceptionCheck()) { 
     // Handle exception here. 
     env->ExceptionClear(); 
    } 
} 

你确定你想叫com/android/app/appActivity,而不是com/android/app/Activity

2

这里有一些想法:

  1. 你用Log.d()的返回确保它不为空,提前打印字符串?

  2. 不确定是否重要,但是您指定了一个整数作为参数,但Java方法在其签名中没有。然后应该在callStaticObjectMethod()中提供此整数作为参数。

  3. 正如Alex P所述,必须处理异常,否则它们会让您头痛,因为它们可能会经常发生并使整个应用程序崩溃。

  4. 我在Android文档的com/android/app/appActivity中找不到任何类。你是不是指com/android/app/Activity?如果是这样,我找不到名为“appData”here的方法。