我在Android中工作,正在编写一些JNI代码,我正在寻找一种从设备中查询移动设备标识符(MEID)的方法。
http://en.wikipedia.org/wiki/Mobile_equipment_identifier
我正在尝试编写可以在安卓设备上独立运行的C或C++代码,所以我不认为我可以使用Java (即从TelephonyManager获取MEID )。
搜索StackOverflow发现:Is there an android shell or adb command that I could use to get a device's IMEI/MEID?
好的很好dumpsys iphonesubinfo可以得到我需要的信息。而且它起作用了!
我找不到dumpsys的源代码,除了作为安卓源代码的一部分。所以我下载了..。在下载完成之前,我的硬盘已经满了,但我还是把源代码下载到了dumpsys上。这是一个非常短的C++文件。它所做的就是查询Android的IBinder界面。
所以,我的问题是:
0)有没有办法只使用NDK中的东西来编写对IBinder的查询?dumpsys.cpp使用的包含文件不在NDK中,并且NDK目录中的grep在任何包含文件或代码示例中都没有找到IBinder,所以我猜是"no“(但我希望是错误的)。
1)有没有其他获取MEID的好方法?
我在认真地考虑我应该只使用system("dumpsys iphonesubinfo > /tmp/myprogname_dumpsys.tmp",然后打开结果文件并解析它。这应该行得通,但我很难称之为优雅...我也不确定是否所有的安卓设备都可以使用dumpsys。
编辑:使用system()运行dumpsys的想法行不通,因为dumpsys需要android.permission.DUMP,而安卓不再允许非系统应用拥有该权限。
发布于 2012-07-25 14:32:06
我相信Dalvik实现的JNI接口与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 */发布于 2012-07-25 23:50:31
在Java端检索MEID,然后将其作为jstring参数传递给JNI函数。这比从C回调Java要干净得多。
至于如何检索它,请参见Abhilasha的答案。
https://stackoverflow.com/questions/11643498
复制相似问题