20 JNI - c++层 操作 java 层对象
Android Ndk 学习笔记(目录)
1 1 int 基本类型 , String 引用对象类型, int[] array 类型 String [] 引用对象数组类型
public native void testArrayAction(int count, String textInfo, int[] ints, String[] strs); // String引用类型,玩数组
public void test01(View view) {int[] ints = new int[]{18,28,38,48,58,68}; // 基本类型的数组String[] strs = new String[]{"小龙","小杰","小霸"}; // 对象类型的数组testArrayAction(99, "你好", ints, strs);for (int anInt : ints) {Log.i("info", "Java test01: anInt:" + anInt);}for (String item : strs) {Log.i("info", "Java test01: strings:" + item);}}
extern "C"
JNIEXPORT void JNICALL
Java_com_cn_mynativestudy_MainActivity_testArrayAction(JNIEnv *env,jobject thiz,jint count,jstring text_info,jintArray ints,jobjectArray strs) {// C++ jint 对应 java int// C++ jstring 对应 java String 或 Object// C++ jintArray 对应 java int[]// C++ jobjectArray 对应 java String[] 或 Object []//1 JNI 中 jint 可以直接赋值 给 c++ 中 intint c_int = count ;LOGI("int = %d",c_int);const char * c_string1 = env->GetStringUTFChars(text_info,NULL);LOGI("string1 = %s",c_string1);char * c_string2 = const_cast<char *>(env->GetStringUTFChars(text_info, NULL));LOGI("string2 = %s",c_string2);env->ReleaseStringUTFChars(text_info,c_string1);env->ReleaseStringUTFChars(text_info,c_string2);int * intArrays = env->GetIntArrayElements(ints ,NULL);for (int i = 0; i < env->GetArrayLength(ints); ++i) {*(intArrays + i)+1;LOGI("ints[%d] = %d",i,*(intArrays +i));}/*** 刷新 java 层 数据* 0: 刷新Java数组,并 释放C++层数组* JNI_COMMIT: 只提交 只刷新Java数组,不释放C++层数组* JNI_ABORT: 只释放C++层数组*/env->ReleaseIntArrayElements(ints,intArrays,0);jsize str_size = env->GetArrayLength(strs);for (int i = 0; i <str_size; ++i) {jstring j_str = static_cast<jstring>(env->GetObjectArrayElement(strs , i));const char * item = env->GetStringUTFChars(j_str,NULL);LOGI("strs[%d] = %s",i,item);env->ReleaseStringUTFChars(j_str,item);}}
2 传递引用类型,传递对象
public native void putObject(Student student, String str); // 传递引用类型,传递对象
public void test02(View view) {Student student = new Student(); // Java newstudent.name = "史泰龙";student.age = 88;putObject(student, "九阳神功");}
extern "C"
JNIEXPORT void JNICALL
Java_com_cn_mynativestudy_MainActivity_putObject(JNIEnv *env, jobject thiz, jobject student,jstring str) {jclass j_student = env->GetObjectClass(student);char * classpath = "com/cn/mynativestudy/c19/Student";jclass j_student2 = env->FindClass(classpath);jmethodID j_setName1 = env->GetMethodID(j_student,"setName", "(Ljava/lang/String;)V");jmethodID j_setName2 = env->GetMethodID(j_student2,"setName", "(Ljava/lang/String;)V");jmethodID j_getName1 = env->GetMethodID(j_student,"getName", "()Ljava/lang/String;");jmethodID j_getName2 = env->GetMethodID(j_student2,"getName", "()Ljava/lang/String;");jstring name1 = env->NewStringUTF("哇啊啊");env->CallVoidMethod(student,j_setName1,name1);jstring j_getname1 = static_cast<jstring>(env->CallObjectMethod(student, j_getName1));char * c_getname1 = const_cast<char *>(env->GetStringUTFChars(j_getname1, NULL));LOGI("c_getname1 = %s",c_getname1);jstring name2 = env->NewStringUTF("呼哈哈");env->CallVoidMethod(student,j_setName2,name2);jstring j_getname2 = static_cast<jstring>(env->CallObjectMethod(student, j_getName2));char * c_getname2 = const_cast<char *>(env->GetStringUTFChars(j_getname2, NULL));LOGI("c_getname2 = %s",c_getname2);jmethodID showInfo = env->GetStaticMethodID(j_student, "showInfo", "(Ljava/lang/String;)V");jstring jstringValue = env->NewStringUTF("我是C++");env->CallStaticVoidMethod(j_student, showInfo, jstringValue);}
3 通过包名创建对象
public native void insertObject();
public void test03(View view) {insertObject();}
extern "C"
JNIEXPORT void JNICALL
Java_com_cn_mynativestudy_MainActivity_insertObject(JNIEnv *env, jobject thiz) {char * classpath = "com/cn/mynativestudy/c19/Student";jclass j_student_class = env->FindClass(classpath);jmethodID j_setName1 = env->GetMethodID(j_student_class,"setName", "(Ljava/lang/String;)V");jstring name1 = env->NewStringUTF("哇啊啊");// AllocObject 只实例化对象,不会调用对象的构造函数jobject j_student_obj = env->AllocObject(j_student_class);env->CallVoidMethod(j_student_obj,j_setName1,name1);char * person_class_path = "com/cn/mynativestudy/c19/Person";jclass j_person_class = env->FindClass(person_class_path);jmethodID j_setStudent = env->GetMethodID(j_person_class,"setStudent", "(Lcom/cn/mynativestudy/c19/Student;)V");jobject j_person_obj = env->AllocObject(j_person_class);env->CallVoidMethod(j_person_obj,j_setStudent,j_student_obj);jmethodID j_static_putStudent = env->GetStaticMethodID(j_person_class,"putStudent","(Lcom/cn/mynativestudy/c19/Student;)V");env->CallStaticVoidMethod(j_person_class,j_static_putStudent,j_student_obj);env->DeleteLocalRef(j_student_obj);env->DeleteLocalRef(j_student_class);env->DeleteLocalRef(j_person_obj);env->DeleteLocalRef(j_person_class);
}
4 测试引用
public native void testQuote(); // 测试引用
public void test04(View view) {testQuote();}
jclass dogClass; // 你以为这个是全局引用,实际上他还是局部引用extern "C"
JNIEXPORT void JNICALL
Java_com_cn_mynativestudy_MainActivity_testQuote(JNIEnv *env, jobject thiz) {if (NULL == dogClass) {/*const char * dogStr = "com/derry/as_jni_project/Dog";dogClass = env->FindClass(dogStr);*/// 升级全局引用: JNI函数结束也不释放,反正就是不释放,必须手动释放 -----//相当于: C++ 对象 new、手动deleteconst char * dogStr = "com/cn/mynativestudy/c19/Dog";jclass temp = env->FindClass(dogStr);dogClass = static_cast<jclass>(env->NewGlobalRef(temp)); // 提升全局引用// 记住:用完了,如果不用了,马上释放,C C++ 工程师的赞美env->DeleteLocalRef(temp);}jmethodID method1 = env->GetMethodID(dogClass,"<init>","()V");jobject obj1 = env->NewObject(dogClass,method1);jmethodID method2 = env->GetMethodID(dogClass,"<init>","(I)V");obj1 = env->NewObject(dogClass,method2,100);jmethodID method3 = env->GetMethodID(dogClass,"<init>","(II)V");obj1 = env->NewObject(dogClass,method3,200,300);env->DeleteLocalRef(obj1);}
5 释放全局引用
public native void delQuote(); // 释放全局引用
public void test05(View view) {delQuote(); // 必须释放全局引用}
extern "C"
JNIEXPORT void JNICALL
Java_com_cn_mynativestudy_MainActivity_delQuote(JNIEnv *env, jobject thiz) {if (dogClass != NULL) {LOGE("全局引用释放完毕,上面的按钮已经失去全局引用,再次点击会报错");env->DeleteGlobalRef(dogClass);dogClass = NULL; // 最好给一个NULL,指向NULL的地址,不要去成为悬空指针,为了好判断悬空指针的出现}
}
6 extern 关键字 ,方便扩展
extern int age; // 声明age
extern void show(); // 声明show函数
20 JNI - c++层 操作 java 层对象相关推荐
- java 通信层_Android native进程间通信实例-binder篇之——HAL层访问JAVA层的服务
有一天在群里聊天的时候,有人提出一个问题,怎样才能做到HAL层访问JAVA层的接口?刚好我不会,所以做了一点研究. 之前的文章末尾部分说过了service call 可以用来调试系统的binder服务 ...
- 【iOS-cocos2d-X 游戏开发之十三】cocos2dx通过Jni调用Android的Java层代码(上)
本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/725.html ☞ ...
- 【iOS-cocos2d-X 游戏开发之十三】cocos2dx通过Jni调用Android的Java层代码(下)
示例代码段2: Xcode 代码: //静态函数示例2.有参数,无返回值------------------------------$$$$$$$--------------------------- ...
- Java层与Jni层的数组传递(转)
源:Java层与Jni层的数组传递 Android开发中,经常会在Java代码与Jni层之间传递数组(byte[]),一个典型的应用是Java层把需要发送给客户端的数据流传递到Jni层,由Jni层的S ...
- java层 android_Android开发实践:Java层与Jni层的数组传递
Android开发中,经常会在Java代码与Jni层之间传递数组(byte[]),一个典型的应用是Java层把需要发送给客户端的数据流传递到Jni层,由Jni层的Socket代码发送出去,当然,Jni ...
- jni java返回数组_Android开发实践:Java层与Jni层的数组传递
Android开发中,经常会在Java代码与Jni层之间传递数组(byte[]),一个典型的应用是Java层把需要发送给客户端的数据流传递到Jni层,由Jni层的Socket代码发送出去,当然,Jni ...
- Android开发实践:Java层与Jni层的数组传递
Android开发中,经常会在Java代码与Jni层之间传递数组(byte[]),一个典型的应用是Java层把需要发送给客户端的数据流传递到Jni层,由Jni层的Socket代码发送出去,当然,Jni ...
- 【Android FFMPEG 开发】FFMPEG ANativeWindow 原生绘制 ( Java 层获取 Surface | 传递画布到本地 | 创建 ANativeWindow )
文章目录 I . FFMPEG ANativeWindow 原生绘制 II . FFMPEG 原生绘制流程 III . Java 层获取 Surface 画布 IV . 传递 Surface 画布到 ...
- Android系统中的Binder通信机制分析(7)- Java 层的 Binder 机制
声明 其实对于Android系统Binder通信的机制早就有分析的想法,记得2019年6.7月份Mr.Deng离职期间约定一起对其进行研究的,但因为我个人问题没能实施这个计划,留下些许遗憾- 文中参考 ...
最新文章
- poi 合并单元格_POI数据获取脚本分享
- 创建符合标准的、有语意的HTML页面——ASP.NET 2.0 CSS Friendly Control Adapters 1.0发布...
- C#正则表达式匹配字符串中的数字
- 案例分析:机场运作系统
- python requests text content_python request text 和 content的区别
- 织梦cms技巧:织梦登录后台显示空白页的解决办法
- bootstrap怎么在一个页面渲染多个表格_推荐一个前端框架
- ORACLE REPLACE函数
- ibatis spring框架升级到5.x_Java SSM框架常见面试题,良心整理,
- docker pull的镜像放在哪里_Docker 安装ELK及Docker常见命令
- 公司新来的小可爱,竟然把内存搞崩了!
- 5种SpringBoot热部署方式,你用哪种?
- 从坐标移动_ABB知识点13:工件坐标系定义
- java怎么进行浮点数运算_【考试经验】Java中实现浮点数的精确运算
- 世界名校、大厂人才汇聚,“马栏山杯”算法大赛打造 AI 视频竞技场
- 无锡科技职业学院院长孙兴洋应邀到美和易思作专题讲座
- CCF推荐会议(人工智能与模式识别)
- html5 新增input类型,html5新增的input类型
- photoshop抠图与相框的制作
- python分时间段统计_Python Pandas:按日期分组并统计每个时段的新记录