1

我正在使用 Android 编写一些 JNI 代码,并且正在寻找一种从设备中查询移动设备标识符 (MEID) 的方法。

http://en.wikipedia.org/wiki/Mobile_equipment_identifier

我正在尝试编写可以在 Android 设备上自行运行的 C 或 C++ 代码,所以我认为我不能使用 Java(即从 获取 MEID TelephonyManager)。

搜索 StackOverflow 发现:是否有我可以用来获取设备的 IMEI/MEID 的 android shell 或 adb 命令?

好的很好,dumpsys iphonesubinfo可以得到我需要的信息。它有效!

dumpsys除了作为 Android 源代码的一部分,我找不到源代码。所以我下载了那个......我的硬盘在下载完成之前就已经装满了,但我确实得到了dumpsys. 这是一个非常短的 C++ 文件。它所做的只是查询Android的IBinder界面。

所以,我的问题:

0) 有什么方法可以编写一个查询来反对IBinder只使用 NDK 中的东西吗?使用的包含文件dumpsys.cpp不在 NDK 中,并且grep在 NDK 目录中没有找到IBinder任何包含文件或代码示例,所以我的猜测是“否”(但我想是错误的)。

1)还有其他获取MEID的好方法吗?

我认真地认为我应该只使用system("dumpsys iphonesubinfo > /tmp/myprogname_dumpsys.tmp"然后打开生成的文件并解析它。这应该可行,但我很难称它为优雅......而且我不确定是否dumpsys在每个 Android 设备上都可用。

system()编辑:使用运行的想法dumpsys将行不通,因为dumpsys需要android.permission.DUMP和 Android 不再允许非系统应用程序拥有该权限。

java中的Dumpsys权限拒绝

4

2 回答 2

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 */
于 2012-07-25T06:32:06.343 回答
0

在 Java 端检索 MEID,然后将其作为jstring参数传递给您的 JNI 函数。它会比从 C 调用回 Java 更干净。

至于如何检索它,请参阅 Abhilasha 的回答。

于 2012-07-25T15:50:30.650 回答