Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android——从JNI获取MEID_Android_C++_C_Android Ndk_Java Native Interface - Fatal编程技术网

Android——从JNI获取MEID

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的源代码。所以我下载了。。。在

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

我试图编写一个可以在Android设备上运行的C或C++代码,所以我认为我不能用java(即,从MEDID获得GEID MID,TeloPyMyMys< /Cuff>)。 对StackOverflow的搜索发现:

好的,很好,
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代码