[英]How to integrate android native code with Qt Quick project?
I am trying to get wifi name connected to my mobile using QAndroidJniObject.我正在尝试使用 QAndroidJniObject 将 wifi 名称连接到我的手机。
java file:
java文件:
package org.qtproject.example;
import android.net.NetworkInfo.DetailedState;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.app.Activity;
import android.content.Context;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class QtAndroidToastJava extends QtActivity
{
public static String getWifiName(Context context) {
WifiManager manager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
if (manager.isWifiEnabled()) {
WifiInfo wifiInfo = manager.getConnectionInfo();
if (wifiInfo != null) {
DetailedState state = WifiInfo.getDetailedStateOf(wifiInfo.getSupplicantState());
if (state == DetailedState.CONNECTED || state == DetailedState.OBTAINING_IPADDR) {
return wifiInfo.getSSID();
}
}
}
return null;
}
}
My cpp code is我的 cpp 代码是
void WIFICLASS::updateAndroidNotification()
{
qDebug()<<"******************************************8";
auto returnString = QAndroidJniObject::callStaticMethod <jstring>("org/qtproject/example/QtAndroidToastJava",
"getWifiName","(V;)Ljava/lang/String");
// // QString user = juser.toString();
// qDebug()<<"ANSWER"<<user;
qDebug()<<returnString;
}
After trying to build this I am getting this errors: 23: error: undefined reference to '_jstring* QAndroidJniObject::callStaticMethod<_jstring*>(char const*, char const*, char const*, ...) '在尝试构建这个之后,我得到了这个错误: 23: error: undefined reference to '_jstring* QAndroidJniObject::callStaticMethod<_jstring*>(char const*, char const*, char const*, ...) '
How can I solve this issue?我该如何解决这个问题?
What is the correct way to do this?这样做的正确方法是什么?
There are two things wrong here:这里有两件事不对:
1.) The message signature you are passing in C++ is wrong. 1.) 您在 C++ 中传递的消息签名是错误的。 It should be:
它应该是:
"(Landroid/content/Context;)Ljava/lang/String;"
Mind the ;
介意的
;
at the end of each class name!在每个班级名称的末尾! It is always
L<classname>;
它总是
L<classname>;
! ! Also, you have to always exactly match the method as declared in java.
此外,您必须始终完全匹配 java 中声明的方法。 Multiple parameters do not need to be seperated.
多个参数不需要分开。 If you have eg a method
void test(int a, int b)
, the signature would be (II)V
.例如,如果您有一个方法
void test(int a, int b)
,则签名将是(II)V
。
2.) The method you are calling is an object method, which means you must use QAndroidJniObject::callStaticObjectMethod
2.) 你调用的方法是一个对象方法,这意味着你必须使用
QAndroidJniObject::callStaticObjectMethod
auto res = QAndroidJniObject::callStaticObjectMethod("org/qtproject/example/QtAndroidToastJava",
"getWifiName",
"(Landroid/content/Context;)Ljava/lang/String;",
QtAndroid::androidContext().object());
That method returns you an QAndroidJniObject
and you can call QAndroidJniObject::toString()
to convert the result to a string.该方法返回一个
QAndroidJniObject
,您可以调用QAndroidJniObject::toString()
将结果转换为字符串。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.