Android——从JNI获取MEID
我在Android中工作,编写一些JNI代码,我正在寻找一种从设备中查询移动设备标识符(MEID)的方法 我试图编写一个可以在Android设备上运行的C或C++代码,所以我认为我不能用java(即,从MEDID获得GEID MID,TeloPyMyMys< /Cuff>)。 对StackOverflow的搜索发现: 好的,很好,Android——从JNI获取MEID,android,c++,c,android-ndk,java-native-interface,Android,C++,C,Android Ndk,Java Native Interface,我在Android中工作,编写一些JNI代码,我正在寻找一种从设备中查询移动设备标识符(MEID)的方法 我试图编写一个可以在Android设备上运行的C或C++代码,所以我认为我不能用java(即,从MEDID获得GEID MID,TeloPyMyMys< /Cuff>)。 对StackOverflow的搜索发现: 好的,很好,dumpsys iphonesubinfo可以获得我需要的信息。而且它有效 除了作为Android源代码的一部分,我找不到dumpsys的源代码。所以我下载了。。。在
dumpsys iphonesubinfo
可以获得我需要的信息。而且它有效
除了作为Android源代码的一部分,我找不到dumpsys
的源代码。所以我下载了。。。在下载完成之前,我的硬盘已满,但我确实将源代码下载到了dumpsys
。这是一个惊人的短C++文件。它所做的只是查询Android的IBinder
界面
所以,我的问题是:
0)是否有任何方法可以仅使用NDK中的内容编写针对IBinder
的查询?dumpsys.cpp
使用的include文件不在NDK中,NDK目录中的grep
在任何include文件或代码示例中都找不到IBinder
,因此我的猜测是“否”(但我想是错的)
1) 有没有其他好的方法来获取MEID
我认真地想,我应该使用系统(“dumpsys iphonesubinfo>/tmp/myprogname\u dumpsys.tmp”
,然后打开生成的文件并对其进行解析。这应该是可行的,但我很难称之为优雅的……而且我不确定dumpsys
是否在每个Android设备上都可用
编辑:使用system()
运行dumpsys
的想法行不通,因为dumpsys
需要android.permission.DUMP
并且android不再允许非系统应用拥有该权限
我相信Dalvik实现了与JVM相同的所有JNI接口,因此,尽管它有点复杂,但完全可以通过JNI从本机代码调用任意Java类和方法
/*假设您已经*/
JNIEnv*env;
作业对象上下文;
/*然后调用(带有错误检查)*/
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,“电话服务”,
“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、电话、mid);
jsize len=(*env)->GetStringUTFLength(env,str);
char*deviceId=calloc(len+1,1);
(*env)->GetStringUTFRegion(env,str,0,len,deviceId);
(*env)->DeleteLocalRef(env,str);
/*在deviceId中获取字符串*/
我相信Dalvik实现了JVM所实现的所有相同的JNI接口,因此尽管它有点复杂,但完全可以通过JNI从本机代码调用任意Java类和方法
/*假设您已经*/
JNIEnv*env;
作业对象上下文;
/*然后调用(带有错误检查)*/
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,“电话服务”,
“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、电话、mid);
jsize len=(*env)->GetStringUTFLength(env,str);
char*deviceId=calloc(len+1,1);
(*env)->GetStringUTFRegion(env,str,0,len,deviceId);
(*env)->DeleteLocalRef(env,str);
/*在deviceId中获取字符串*/
在Java端检索MEID,然后作为jstring
参数传递到JNI函数中。这比从C调用Java更简洁
至于如何检索,请参见Abhilasha的答案。在Java端检索MEID,然后将其作为
jstring
参数传递到JNI函数中。这比从C调用Java更简洁
至于如何检索,请参见Abhilasha的答案。
dumpsys
是一个平台系统文件,所以我认为它在每个android设备上都可用。另外,如果你想编写一个类似dumpsys
的查询,你可以通过NDK,但也要记住你拥有所需的所有权限。@user370305——我如何编写类似dum的查询psys
通过NDK?使用相同的代码,这是dumpsys
使用的。但我怀疑dumpsys
是否有权访问所有系统文件。我不能使用dumpsys
使用的相同代码,因为dumpsys
使用的代码不在NDK中。我不希望我的代码依赖于“机密”作为Android系统源代码的一部分但未放入NDK中的代码。dumpsys
是一个平台系统文件,因此我认为它在每个Android设备上都可用。此外,如果您想编写类似dumpsys
的查询,您可以通过NDK,但我也要记住,您拥有所需的所有权限。@user370305--我如何编写像通过NDK的dumpsys
这样的查询?使用与dumpsys
相同的代码。但我怀疑dumpsys
是否有权访问所有系统文件。我不能使用dumpsys
使用的相同代码,因为dumpsys
使用的代码不在NDK中。我不希望我的代码必须依赖于“机密”代码,是Android系统源代码的一部分,但未放入NDK.My测试应用程序,调用我的JNI代码