我正在为我的工程学院开展一个项目,我必须让两个Android设备通过Wi-Fi进行通信。 其中一个Android设备将打开其热点,另一个设备将连接到它。
我在C ++中使用Qt 5.4.1(Qt Creator 3.4.1)。
通过搜索网络,我发现这个Java类:WifiManager.java具有(dis / en)Wifi接入点的方法:setWifiApEnabled
遵循Bogdan Vatra的指导方针,我成功地在c ++代码中调用了Java方法。 例如,对于斐波那契函数:
JniMath.java:
package org.app.test;
public class JniMath {
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);
}
}
C ++代码:
int FenetrePrinc::fibonacci(int n)
{
return QAndroidJniObject::callStaticMethod<jint>("org/app/test/JniMath"
, "fibonacci"
, "(I)I" //Because int fibonacci(int)
, n);
}
有效。
但如果我想对“setWifiApEnabled”函数做同样的事情,请从“WifiApManager.java”:
package org.app.test;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Method;
import java.net.InetAddress;
import java.util.ArrayList;
import android.content.Context;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.os.Handler;
import android.util.Log;
public class WifiApManager {
private final WifiManager mWifiManager;
private Context context;
public WifiApManager(Context context) {
this.context = context;
mWifiManager = (WifiManager) this.context.getSystemService(Context.WIFI_SERVICE);
}
public boolean setWifiApEnabled(WifiConfiguration wifiConfig, boolean enabled) {
try {
if (enabled) { // disable WiFi in any case
mWifiManager.setWifiEnabled(false);
}
Method method = mWifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);
return (Boolean) method.invoke(mWifiManager, wifiConfig, enabled);
} catch (Exception e) {
Log.e(this.getClass().toString(), "", e);
return false;
}
}
public WifiConfiguration getWifiApConfiguration() {
try {
Method method = mWifiManager.getClass().getMethod("getWifiApConfiguration");
return (WifiConfiguration) method.invoke(mWifiManager);
} catch (Exception e) {
Log.e(this.getClass().toString(), "", e);
return null;
}
}
}
C ++代码:
class WifiManager:
{
public:
WifiManager()
{
myJavaWifiApManager = QAndroidJniObject("org/app/test/WifiApManager");
if(myJavaWifiApManager.isValid())
qDebug() << "Object is valid";
else
qDebug() << "Object isn't valid";
}
bool setWifiApEnabled(QAndroidJniObject wifiConfig, bool enabled)
{
return myJavaWifiApManager.callMethod<jboolean>("org/app/test/WifiApManager"
, "setWifiApEnabled"
, "(Landroid/net/wifi/WifiConfiguration;Z)Z"
, wifiConfig.object<jobject>(), enabled);
}
QAndroidJniObject WifiManager::getWifiApConfiguration()
{
return myJavaWifiApManager.callObjectMethod<jobject>("getWifiApConfiguration"
, "()Landroid/net/wifi/WifiConfiguration");
}
private:
QAndroidJniObject myJavaWifiApManager;
QAndroidJniObject myWifiConfig;
它汇编得很好,但是当我说它时,它说“myJavaWifiApManager无效”
因此,如果我尝试拨打setWifiApEnabled
或getWifiApConfiguration
,则会崩溃。
知道为什么对象无效吗?
它在“WifiApManager.java”中描述,位于“%% PROJECT_FOLDER %% / android / src / org / app / test”
如果我将对象声明为myJavaWifiApManager = QAndroidJniObject("org/app/test/JniMath");
,则该对象有效