Android – 从JNI获取MEID
我正在使用Android,编写一些JNI代码,我正在寻找一种从设备查询移动设备标识符(MEID)的方法。
http://en.wikipedia.org/wiki/Mobile_equipment_identifier
我正在尝试编写可以在Android设备上自行运行的C或C ++代码,所以我认为我不能使用Java(即从TelephonyManager
获取MEID)。
搜索StackOverflow发现: 是否有一个android shell或adb命令,我可以使用它来获取设备的IMEI / MEID?
好的, dumpsys iphonesubinfo
可以获得我需要的信息。 它的工作原理!
除了作为Android源代码的一部分之外,我找不到dumpsys
的源代码。 所以我下载了…我的硬盘在下载完成之前已经填满了,但我确实得到了dumpsys
的源代码。 这是一个令人惊讶的短C ++文件。 它只是查询Android的IBinder
界面。
所以,我的问题:
0)有没有什么办法可以IBinder
使用NDK中的东西来编写对IBinder
的查询? dumpsys.cpp
使用的包含文件不在NDK中,并且NDK目录中的grep
在任何包含文件或代码示例中都找不到IBinder
,所以我的猜测是“不”(但我想错了)。
1)有没有其他好的方法来获得MEID?
我认真考虑我应该只使用system("dumpsys iphonesubinfo > /tmp/myprogname_dumpsys.tmp"
然后打开生成的文件并解析它。这应该可行,但我很难称之为优雅…而且我是不确定每个Android设备上是否有dumpsys
可用。
编辑:使用system()
运行dumpsys
将无法正常工作,因为dumpsys
需要android.permission.DUMP
和Android不再允许非系统应用程序拥有该权限。
在Java中Dumpsys权限拒绝
我相信Dalvik实现了JVM所做的所有相同的JNI接口,因此虽然它有点繁琐,但完全可以通过JNI从本机代码调用到任意Java类和方法。
/* assuming you already have */ JNIEnv *env; jobject context; /* then call (with error-checking) */ jclass cls = (*env)->FindClass(env, "android/context/Context"); jmethodId mid = (*env)->GetMethodID(env, context_cls, "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;"); jfieldID fid = (*env)->GetStaticFieldID(env, cls, "TELEPHONY_SERVICE", "Ljava/lang/String;"); jstring str = (*env)->GetStaticObjectField(env, cls, fid); jobject telephony = (*env)->CallObjectMethod(env, context, mid, str); cls = (*env)->FindClass(env, "android/telephony/TelephonyManager"); mid =(*env)->GetMethodID(env, cls, "getDeviceId", "()Ljava/lang/String;"); str = (*env)->CallObjectMethod(env, telephony, mid); jsize len = (*env)->GetStringUTFLength(env, str); char* deviceId = calloc(len + 1, 1); (*env)->GetStringUTFRegion(env, str, 0, len, deviceId); (*env)->DeleteLocalRef(env, str); /* to get a string in deviceId */
检索Java端的MEID,然后作为jstring
参数传递给JNI函数。 它比从C回调Java要干净得多。
至于如何检索,请参阅Abhilasha的回答。