在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;}
阅读全文
0 0
- 在C++中调用JAVA的内部类方法
- 关于java成员内部类(普通内部类)在main方法中调用
- java静态方法中调用内部类
- Java静态方法中调用内部类
- java中匿名内部类的构造方法调用
- Java中内部类的调用
- java中内部类的访问调用
- java中内部类的访问调用
- java中内部类的访问调用
- java如何在主类方法调用内部类
- java如何在主类方法调用内部类
- Java在外部类的方法中创建内部类对象
- JAVA - - - - 内部类的方法(外部调用内部类的方法)
- Java内部类的调用
- java中加载及方法、内部类与成员的调用关系
- 匿名内部类实现多线程,内部类调用外部方法中定义的变量
- Java调用内部类成员函数的一个方法
- Java private和protected修饰的内部类调用方法
- CodeForces
- What is Java thread priority? 什么是java线程优先级
- MySQL 通过变量实现RowNumber
- 剑指offer-06
- java常用设计模式(转载)
- 在C++中调用JAVA的内部类方法
- UML概述
- 【VS开发】MFC动态设置对话框属性 弹出或嵌入
- GoAccess日志分析工具
- node.js笔记——文件之间的引入
- hibernate最基础所需要的包
- sicily 20622. 单词变换(week 19)
- View组件及UI界面控制方法
- Android kernel build from source code and from prebuilt