在C++中调用JAVA的内部类方法

来源:互联网 发布:全国禁毒网络知识竞赛 编辑:程序博客网 时间:2024/04/26 17:17

在NDK开发中,有时候会用C++去调用JAVA的方法,下面演示如何在C++中调用JAVA的内部类方法。
需要注意的是FindClass的时候需要用$连接内部类的类名。
下面的函数通过调用Settings.Secure.getString(Context context,String name)来获取Android ID:

std::string getAid(JNIEnv *env, jobject context) {    //先找到静态内部类Settings.Secure,内部类的类名要用$连接    jclass clazSecure = env->FindClass("android/provider/Settings$Secure");    if (clazSecure == NULL) {        return "unknown";    }    //查找getString(Context context,String name)的方法ID    jmethodID midGetString = env->GetStaticMethodID(clazSecure, "getString",                                                    "(Landroid/content/ContentResolver;Ljava/lang/String;)Ljava/lang/String;");    if (midGetString == NULL) {        return "unknown";    }    //找到Context    jclass clazContext = env->FindClass("android/content/Context");    if (clazContext == NULL) {        return "unknown";    }    //查找getContentResolver的方法ID    jmethodID midGetContentResolver = env->GetMethodID(clazContext, "getContentResolver",                                                       "()Landroid/content/ContentResolver;");    if (midGetContentResolver == NULL) {        return "unknown";    }    //调用getContentResolver获取ContentResolver的实例    jobject objResolver = env->CallObjectMethod(context, midGetContentResolver);    if (objResolver == NULL) {        return "unknown";    }    //调用getString(Context context,String name)获取Android ID    jstring name = env->NewStringUTF("android_id");    jobject objAid = env->CallStaticObjectMethod(clazSecure, midGetString, objResolver, name);    //将jstring转换为string    char *aidCString = jstringToChar(env, (jstring) objAid);    std::string aid = aidCString;    //删除局部变量引用    env->DeleteLocalRef(clazSecure);    env->DeleteLocalRef(clazContext);    env->DeleteLocalRef(objResolver);    return aid;}/** * cast jstring to char* * @param env * @param jstr * @return */char *jstringToChar(JNIEnv *env, jstring jstr) {    char *rtn = NULL;    jclass clsstring = env->FindClass("java/lang/String");    jstring strencode = env->NewStringUTF("GB2312");    jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");    jbyteArray barr = (jbyteArray) env->CallObjectMethod(jstr, mid, strencode);    jsize alen = env->GetArrayLength(barr);    jbyte *ba = env->GetByteArrayElements(barr, JNI_FALSE);    if (alen > 0) {        rtn = (char *) malloc(alen + 1);        memcpy(rtn, ba, alen);        rtn[alen] = 0;    }    env->ReleaseByteArrayElements(barr, ba, 0);    return rtn;}
原创粉丝点击