Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从c++;在qt内 我试图用QANDROIDJNIObjor调用C++中的Android活动定义的方法。 这是我在C++类中的调用 QAndroidJniObject data = QAndroidJniObject::callStaticObjectMethod("com/android/app/appActivity", "appData", "(I)Ljava/lang/String;"); QString dataValue = data.toString(); qDebug() <<"Data is " << dataValue;_Java_Android_C++_Qt_Java Native Interface - Fatal编程技术网

从c++;在qt内 我试图用QANDROIDJNIObjor调用C++中的Android活动定义的方法。 这是我在C++类中的调用 QAndroidJniObject data = QAndroidJniObject::callStaticObjectMethod("com/android/app/appActivity", "appData", "(I)Ljava/lang/String;"); QString dataValue = data.toString(); qDebug() <<"Data is " << dataValue;

从c++;在qt内 我试图用QANDROIDJNIObjor调用C++中的Android活动定义的方法。 这是我在C++类中的调用 QAndroidJniObject data = QAndroidJniObject::callStaticObjectMethod("com/android/app/appActivity", "appData", "(I)Ljava/lang/String;"); QString dataValue = data.toString(); qDebug() <<"Data is " << dataValue;,java,android,c++,qt,java-native-interface,Java,Android,C++,Qt,Java Native Interface,但我得到的null是dataValue,它不会抛出任何错误 您可能需要手动检查异常以获取Java错误 发件人: 处理Java异常 调用可能引发异常的Java函数时,在继续之前检查、处理并清除异常非常重要 注意:当存在挂起的异常时,进行JNI调用是不安全的 void functionException() { QAndroidJniObject myString=QAndroidJniObject::fromString(“你好”); jchar c=myString.callMethod(“

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

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

发件人:

处理Java异常

调用可能引发异常的Java函数时,在继续之前检查、处理并清除异常非常重要

注意:当存在挂起的异常时,进行JNI调用是不安全的

void functionException()
{  
QAndroidJniObject myString=QAndroidJniObject::fromString(“你好”);
jchar c=myString.callMethod(“charAt”,“I)c”,1000);
QandroidjnienEnvironment;
如果(环境->例外检查()){
//在这里处理异常。
环境->例外清除();
}
}

您确定要呼叫
com/android/app/appActivity
而不是
com/android/app/Activity

以下是一些想法:

  • 您是否使用Log.d()在返回前打印字符串以确保它不为null

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

  • 正如Alex p所提到的,必须处理异常,否则它们会让您头疼,因为它们可能经常发生,并使整个应用程序崩溃

  • 我在android文档中找不到com/android/app/appActivity上的任何类。你是说com/android/app/Activity吗?如果是这样,我找不到名为“appData”的方法


  • 谢谢你们的回答,我终于明白了。这很简单,当时我正在努力

    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")`
    
    QAndroidJniObject data=QAndroidJniObject::callStaticObjectMethod(“com/android/app/appActivity”,
    “应用数据”)`
    
    表示我定义的java方法的返回类型。
    我想这是我自己犯的愚蠢的错误……再次谢谢你,我今天也有同样的问题。虽然它与您的代码不同,但返回值也是空的。以下是我的代码:

    package org.test.project.test;
    public class TestJava {
            public static String notify(int iNumber )
            {
                String strNum = iNumber+"";
                return strNum;
            }
    }
    

    然后是C++代码:

    QAndroidJniObject str = QAndroidJniObject::callStaticObjectMethod("org/test/project/test/TestJava",
                                                  "notify",
                                                  "(I)Ljava/lang/String;",
                                                  m_iNumber);
    //the str always been NULL
    

    dataVale
    dataValue
    不匹配。(可能只是一个抄写错误?)它应该给我语法错误…但我检查了它不是我在2中所说的情况。在我的回答中。很高兴你明白了。您还可以使用签名:“()Ljava/lang/String;”
    package org.test.project.test;
    public class TestJava {
            public static String notify(int iNumber )
            {
                String strNum = iNumber+"";
                return strNum;
            }
    }
    
    QAndroidJniObject str = QAndroidJniObject::callStaticObjectMethod("org/test/project/test/TestJava",
                                                  "notify",
                                                  "(I)Ljava/lang/String;",
                                                  m_iNumber);
    //the str always been NULL