我正在使用Android,编写一些JNI代码,而我正在寻找一种从设备查询移动设备标识符(MEID)的方法。
http://en.wikipedia.org/wiki/Mobile_equipment_identifier
我正在尝试编写可以在Android设备上自行运行的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
可以获得我需要的信息。它有效!
除了作为Android源代码的一部分外,我找不到dumpsys
的来源。所以我下载了...我的硬盘在下载完成之前已经填满了,但我确实得到了dumpsys
的源代码。这是一个令人惊讶的短C ++文件。它所做的就是查询Android的IBinder
界面。
所以,我的问题:
0)有没有办法只使用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不再允许非系统应用获得该权限
答案 0 :(得分:1)
我相信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 */
答案 1 :(得分:0)
在Java端检索MEID,然后作为jstring
参数传递到JNI函数。它比从C回调Java更清晰。
关于如何检索,请参阅Abhilasha的回答。