如何将 android 本机代码与 Qt Quick 项目集成?
How to integrate android native code with Qt Quick project?
我正在尝试使用 QAndroidJniObject 将 wifi 名称连接到我的手机。
java file:
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;
}
}
我的 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;
}
在尝试构建这个之后我收到了这个错误:
23:错误:未定义引用'_jstring* QAndroidJniObject::callStaticMethod<_jstring*>(char const*, char const*, char const*, ...)'
我该如何解决这个问题?
正确的做法是什么?
这里有两处错误:
1.) 您在C++ 中传递的消息签名是错误的。应该是:
"(Landroid/content/Context;)Ljava/lang/String;"
注意每个 class 名称末尾的 ;
!永远是L<classname>;
!此外,您必须始终与 java 中声明的方法完全匹配。多个参数不需要分开。如果你有方法 void test(int a, int b)
,签名为 (II)V
.
2.) 你调用的方法是一个对象方法,也就是说你必须使用QAndroidJniObject::callStaticObjectMethod
auto res = QAndroidJniObject::callStaticObjectMethod("org/qtproject/example/QtAndroidToastJava",
"getWifiName",
"(Landroid/content/Context;)Ljava/lang/String;",
QtAndroid::androidContext().object());
那个方法 returns 你一个 QAndroidJniObject
你可以调用 QAndroidJniObject::toString()
将结果转换为字符串。
我正在尝试使用 QAndroidJniObject 将 wifi 名称连接到我的手机。
java file:
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;
}
}
我的 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;
}
在尝试构建这个之后我收到了这个错误: 23:错误:未定义引用'_jstring* QAndroidJniObject::callStaticMethod<_jstring*>(char const*, char const*, char const*, ...)'
我该如何解决这个问题?
正确的做法是什么?
这里有两处错误:
1.) 您在C++ 中传递的消息签名是错误的。应该是:
"(Landroid/content/Context;)Ljava/lang/String;"
注意每个 class 名称末尾的 ;
!永远是L<classname>;
!此外,您必须始终与 java 中声明的方法完全匹配。多个参数不需要分开。如果你有方法 void test(int a, int b)
,签名为 (II)V
.
2.) 你调用的方法是一个对象方法,也就是说你必须使用QAndroidJniObject::callStaticObjectMethod
auto res = QAndroidJniObject::callStaticObjectMethod("org/qtproject/example/QtAndroidToastJava",
"getWifiName",
"(Landroid/content/Context;)Ljava/lang/String;",
QtAndroid::androidContext().object());
那个方法 returns 你一个 QAndroidJniObject
你可以调用 QAndroidJniObject::toString()
将结果转换为字符串。