我想从c by 获取IMEI JNI
,我使用下面的代码,但是遇到了无法获取的错误cls
,它总是返回NULL
。我检查了env和context,它们都很好。为什么我不能得到Context
类?我从网上搜索,有人说我们应该使用java/lang/Object
而不是使用android/context/Context
,我尝试了这个,它可以工作,cls不再是NULL,但是当我调用时它导致了新的错误getSystemService
,可能是因为常见java/lang/Object
的没有这个方法。可以有人帮我吗?3Q。
char * get_dev_id(JNIEnv *env, jobject context)
{
jclass cls = (*env)->FindClass(env, "android/context/Context");
// ---------------- cls == NULL all the time
jmethodID mid = (*env)->GetMethodID(env, 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 */
return deviceId;
}