Android JNI的Qt:java.lang.NoSuchMethodError
我试图从java中获得一个字符串数组,并将其应用到Qt Android C++中,最终在QML代码中使用,但我得到以下运行时错误,即崩溃:Android JNI的Qt:java.lang.NoSuchMethodError,java,android,qt,java-native-interface,Java,Android,Qt,Java Native Interface,我试图从java中获得一个字符串数组,并将其应用到Qt Android C++中,最终在QML代码中使用,但我得到以下运行时错误,即崩溃: W System.err: java.lang.NoSuchMethodError: no static method "Lcom/test/myTest/JniTest;.getSSIDList(V)[Ljava/lang/String;" Java代码如下所示: package com.test.myTest; import java.util.A
W System.err: java.lang.NoSuchMethodError: no static method
"Lcom/test/myTest/JniTest;.getSSIDList(V)[Ljava/lang/String;"
Java代码如下所示:
package com.test.myTest;
import java.util.ArrayList;
import java.util.List;
public class JniTest
{
public static int fibonacci(int n)
{
if(n<0)
return -1;
else if(n==0 || n==1)
return n;
return fibonacci(n-1)+fibonacci(n-2);
}
public static String[] getSSIDList()
{
List<String> ssidList = new ArrayList<String>();
ssidList.add("string 1");
ssidList.add("string 2");
String[] strings = new String[ssidList.size()];
strings = ssidList.toArray(strings);//now strings is the resulting array
return strings;
}
}
< C++代码是:
void AndroidInterface::test()
{
//qDebug() << fibonacci(4); //this works
qDebug() << getSSIDList(); //this crashes with the error above
}
int AndroidInterface::fibonacci(int n)
{
return QAndroidJniObject::callStaticMethod<jint>("com/test/myTest/JniTest"
, "fibonacci"
, "(I)I"
, n);
}
QStringList AndroidInterface::getSSIDList()
{
QAndroidJniObject stringArray = QAndroidJniObject::callStaticObjectMethod("com/test/myTest/JniTest"
, "getSSIDList"
, "(V)[Ljava/lang/String;");
jobjectArray objectArray = stringArray.object<jobjectArray>();
QAndroidJniEnvironment qjniEnv;
const int n = qjniEnv->GetArrayLength(objectArray);
qDebug() << "Got jobjectArray of length:" << n; // correct
for (int i = 0; i < n; ++i)
{
qDebug() << "Iteration:" << i;
jobject element = qjniEnv->GetObjectArrayElement(objectArray, i);
qDebug() << "Got jobject of type:" << qjniEnv->GetObjectClass(element);
// ...
qjniEnv->DeleteLocalRef(element);
}
QStringList list;
return list;
}
getSSIDList的当前实现只有一个测试虚拟体
我在QML中有一个按钮,它调用上面的AndroidInterface::test代码,该代码适用于fibonacci方法,但getSSIDList方法由于上面的错误而崩溃
我做错了什么?谢谢你的帮助 嗯,您没有为本机方法提供正确的JNI签名。在V[Ljava/lang/String;中不需要V,但在[Ljava/lang/String;V]中需要它 手工为朴素的方法构造正确的C/C++签名是可能的,但很棘手,但幸运的是,您不需要这样做 Android Studio将在这方面为您提供帮助 如果您的IDE中没有内置此功能,请使用javah实用程序从Java类中提取头文件。即使您实际使用Kotlin或其他与JVM兼容的语言,也可以使用此功能
请注意,javah工具计划在下一个主要JDK版本中删除。该工具已被JDK 8中添加到javac的“-h”选项所取代。显然,我的签名是错误的:QAndroidJniObject stringArray=QAndroidJniObject::callStaticObjectMethodcom/test/myTest/JniTest,getSSIDList,V[Ljava/lang/String;;应该在V中没有V…QAndroidJniObject stringArray=QAndroidJniObject::callStaticObjectMethodcom/test/myTest/JniTest,getSSIDList,[Ljava/lang/String;;有人能回答这个问题吗?我不允许回答任何问题,因为我以前的一些答案没有得到很好的回答,因为我曾经在数学论坛上发表过一篇批评性的评论…也许明智的做法是删除这个问题。我相信你在自己的代码中发现的错误没有任何意义我对社区没有价值。我认为我的问题可能仍然是相关的。阅读Qt文档,我根本不清楚我不应该在空参数列表中添加V,这就是我第一次尝试使用V的原因。当然,它与像你这样的专家无关,但对于像我这样的初学者来说,它是相关的。无论如何,谢谢你的评论。我可以将问题作为或的重复关闭,但现在关闭为重复被认为是不礼貌的。底线是,您应该始终为本机方法生成正确的签名。