我正在尝试在mService
类(https://github.com/android/platform_frameworks_base/blob/master/core/java/android/net/ConnectivityManager.java)上的IConnectivityManager
(android.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(我假设这是空的?)