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的回答。