Android - 从JNI获取MEID

时间:2012-07-25 05:51:02

标签: android c++ c android-ndk java-native-interface

我正在使用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不再允许非系统应用获得该权限

Dumpsys permission denial in java

2 个答案:

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