JNI ConnectivityManager - 获取mService的句柄

时间:2013-07-25 10:42:15

标签: android java-native-interface xamarin.android xamarin

我正在尝试在mService类(https://github.com/android/platform_frameworks_base/blob/master/core/java/android/net/ConnectivityManager.java)上的IConnectivityManagerandroid.net.ConnectivityManager)属性上获取JNI句柄,目的是用来启动/停止设备上的3G服务。

我一直在尝试使用Javap来获取签名:

javap -classpath android.jar -s -private android.net.ConnectivityManager

但输出不包含此字段及其签名。这可能使用JNI吗?

我使用了ConnectivityManager类来处理:

static IntPtr class_ref = JNIEnv.FindClass("android/net/ConnectivityManager");

然而,在黑暗中试图获得对场的控制没有结果:

IntPtr getITelephonyFieldId = JNIEnv.GetFieldID(
            class_ref,
            "mService",
            "()Lcom/android/net/IConnectivityManager;");

以前有人试过这个吗?如果有的话,你有任何关于如何使这个工作的提示吗?

[UPDATE]

我一直在玩签名和猜测工作得到了回报。我现在有以下内容:

public class ThreeGService : Java.Lang.Object
{
    private readonly TinyIoCContainer _container;
    static readonly IntPtr ClassRef = JNIEnv.FindClass("android/net/ConnectivityManager");

    public ThreeGService(TinyIoCContainer container)
    {
        _container = container;
    }

    protected override IntPtr ThresholdClass
    {
        get { return ClassRef; }
    }

    public void ToggleThreeG()
    {
        var isEnabled = false;
        var baseActivitySherlock = _container.Resolve<IBaseActivitySherlock>("basesherlockactivity");
        var connectionManager = (ConnectivityManager)baseActivitySherlock.GetSystemService(Context.ConnectivityService);
        var conManager = (ConnectivityManager)baseActivitySherlock.GetSystemService(Context.ConnectivityService);


        IntPtr getITelephonyFieldId = JNIEnv.GetFieldID(
        ThresholdClass,
        "mService",
        "Landroid/net/IConnectivityManager;");

        IntPtr iConnectivityManagerHandle = JNIEnv.GetObjectField(
        ThresholdClass,
        getITelephonyFieldId);

        JNIEnv.CallNonvirtualIntMethod(Handle, ThresholdClass, iConnectivityManagerHandle, new JValue(true));

    }
}

在我到达之前似乎没有任何抱怨:

JNIEnv.CallNonvirtualIntMethod(Handle, ThresholdClass, iConnectivityManagerHandle, new JValue(true));

我得到一个空引用异常。我认为这是因为iConnectivityManagerHandle的值为0x0 - 其他句柄看起来像有效值。

为什么iConnectivityManagerHandle为0x0(我假设这是空的?)

0 个答案:

没有答案