Java 如何在Android中使用JNI获取设备id?

Java 如何在Android中使用JNI获取设备id?,java,android,c,java-native-interface,Java,Android,C,Java Native Interface,我想通过JNI从c获取IMEI,我使用下面的代码,但是遇到了无法获取cls的错误,它总是返回NULL。我检查了env和context,它们都是正确的。为什么我不能获取context类?我在网上搜索,有人说我们应该使用java/lang/Object而不是android/context/context,我尝试了这个,它工作了,cls不再是空的,但是当我调用getSystemService时,它导致了新的错误,可能是因为commonjava/lang/Object没有这个方法。有人能帮我吗?3Q c

我想通过
JNI
从c获取IMEI,我使用下面的代码,但是遇到了无法获取
cls
的错误,它总是返回
NULL
。我检查了env和context,它们都是正确的。为什么我不能获取
context
类?我在网上搜索,有人说我们应该使用
java/lang/Object
而不是
android/context/context
,我尝试了这个,它工作了,cls不再是空的,但是当我调用
getSystemService
时,它导致了新的错误,可能是因为common
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;
}

是的,我已经加载了jni.so,我传递给函数的上下文是
this.getApplicationContext()
MainActivity的结果,我有什么地方错了吗?我知道了,应该是“android/content/context”,而不是“android/context/context”,看起来很多人都错了。