Jni:在C ++代码中调用java方法,错误

时间:2015-06-09 13:48:59

标签: android qt android-ndk java-native-interface

我正在为我的工程学院开展一个项目,我必须让两个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无效” 因此,如果我尝试拨打setWifiApEnabledgetWifiApConfiguration,则会崩溃。 知道为什么对象无效吗? 它在“WifiApManager.java”中描述,位于“%% PROJECT_FOLDER %% / android / src / org / app / test”

如果我将对象声明为myJavaWifiApManager = QAndroidJniObject("org/app/test/JniMath");,则该对象有效

0 个答案:

没有答案