Android JNI ConnectivityManager-获取mService的句柄
我正试图在Android JNI ConnectivityManager-获取mService的句柄,android,java-native-interface,xamarin.android,xamarin,Android,Java Native Interface,Xamarin.android,Xamarin,我正试图在android.net.ConnectivityManager类()上的mService(IConnectivityManager)属性上获取JNI句柄,以用于启动/停止设备上的3g服务 我一直在尝试使用Javap通过以下方式获取签名: javap -classpath android.jar -s -private android.net.ConnectivityManager 但是,输出不包括此字段及其签名。使用JNI这可能吗 我有一个ConnectivityManager类的句
android.net.ConnectivityManager
类()上的mService
(IConnectivityManager
)属性上获取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;");
以前有人尝试过吗?如果是这样的话,你有什么关于如何让它工作的提示吗
[更新]
我一直在玩弄签名,猜测工作终于有了回报。我现在有以下资料:
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));
}
}
在这里我得到一个空引用异常。我认为这是由于iConnectivityManagerHandle的值是0x0这一事实造成的——其他句柄的值看起来像是有效值
如果只需要
ConnectivityManager
为什么不使用:var ConnectivityManager=(ConnectivityManager)GetSystemService(ConnectivityService)代码>?我想获取ConnectionVityManager类的MSService(IconnectivityManager)属性-这不是通过Xamarin实现公开的。反射c#way也不会产生任何结果-访问它的唯一方法是通过JNI-因此我的问题是:)
JNIEnv.CallNonvirtualIntMethod(Handle, ThresholdClass, iConnectivityManagerHandle, new JValue(true));