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 层对象相关推荐

  1. java 通信层_Android native进程间通信实例-binder篇之——HAL层访问JAVA层的服务

    有一天在群里聊天的时候,有人提出一个问题,怎样才能做到HAL层访问JAVA层的接口?刚好我不会,所以做了一点研究. 之前的文章末尾部分说过了service call 可以用来调试系统的binder服务 ...

  2. 【iOS-cocos2d-X 游戏开发之十三】cocos2dx通过Jni调用Android的Java层代码(上)

    本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/725.html ☞ ...

  3. 【iOS-cocos2d-X 游戏开发之十三】cocos2dx通过Jni调用Android的Java层代码(下)

    示例代码段2: Xcode 代码: //静态函数示例2.有参数,无返回值------------------------------$$$$$$$--------------------------- ...

  4. Java层与Jni层的数组传递(转)

    源:Java层与Jni层的数组传递 Android开发中,经常会在Java代码与Jni层之间传递数组(byte[]),一个典型的应用是Java层把需要发送给客户端的数据流传递到Jni层,由Jni层的S ...

  5. java层 android_Android开发实践:Java层与Jni层的数组传递

    Android开发中,经常会在Java代码与Jni层之间传递数组(byte[]),一个典型的应用是Java层把需要发送给客户端的数据流传递到Jni层,由Jni层的Socket代码发送出去,当然,Jni ...

  6. jni java返回数组_Android开发实践:Java层与Jni层的数组传递

    Android开发中,经常会在Java代码与Jni层之间传递数组(byte[]),一个典型的应用是Java层把需要发送给客户端的数据流传递到Jni层,由Jni层的Socket代码发送出去,当然,Jni ...

  7. Android开发实践:Java层与Jni层的数组传递

    Android开发中,经常会在Java代码与Jni层之间传递数组(byte[]),一个典型的应用是Java层把需要发送给客户端的数据流传递到Jni层,由Jni层的Socket代码发送出去,当然,Jni ...

  8. 【Android FFMPEG 开发】FFMPEG ANativeWindow 原生绘制 ( Java 层获取 Surface | 传递画布到本地 | 创建 ANativeWindow )

    文章目录 I . FFMPEG ANativeWindow 原生绘制 II . FFMPEG 原生绘制流程 III . Java 层获取 Surface 画布 IV . 传递 Surface 画布到 ...

  9. Android系统中的Binder通信机制分析(7)- Java 层的 Binder 机制

    声明 其实对于Android系统Binder通信的机制早就有分析的想法,记得2019年6.7月份Mr.Deng离职期间约定一起对其进行研究的,但因为我个人问题没能实施这个计划,留下些许遗憾- 文中参考 ...

最新文章

  1. poi 合并单元格_POI数据获取脚本分享
  2. 创建符合标准的、有语意的HTML页面——ASP.NET 2.0 CSS Friendly Control Adapters 1.0发布...
  3. C#正则表达式匹配字符串中的数字
  4. 案例分析:机场运作系统
  5. python requests text content_python request text 和 content的区别
  6. 织梦cms技巧:织梦登录后台显示空白页的解决办法
  7. bootstrap怎么在一个页面渲染多个表格_推荐一个前端框架
  8. ORACLE REPLACE函数
  9. ibatis spring框架升级到5.x_Java SSM框架常见面试题,良心整理,
  10. docker pull的镜像放在哪里_Docker 安装ELK及Docker常见命令
  11. 公司新来的小可爱,竟然把内存搞崩了!
  12. 5种SpringBoot热部署方式,你用哪种?
  13. 从坐标移动_ABB知识点13:工件坐标系定义
  14. java怎么进行浮点数运算_【考试经验】Java中实现浮点数的精确运算
  15. 世界名校、大厂人才汇聚,“马栏山杯”算法大赛打造 AI 视频竞技场
  16. 无锡科技职业学院院长孙兴洋应邀到美和易思作专题讲座
  17. CCF推荐会议(人工智能与模式识别)
  18. html5 新增input类型,html5新增的input类型
  19. photoshop抠图与相框的制作
  20. python分时间段统计_Python Pandas:按日期分组并统计每个时段的新记录

热门文章

  1. CCS2019:Log2vec论文阅读
  2. Android指纹识别,看这一篇就够了
  3. 批处理bat 延时启动的方法
  4. linux命令行python_干货:4 个绝佳的命令行终端程序
  5. Java类与对象案例之打字游戏
  6. golang fmt包中的占位符
  7. 我们走访了十几家美国企业服务公司,写下了这篇万字长文
  8. 仿网易云音乐html代码,仿网易云音乐外链播放器UI的HTML5音乐播放器插件
  9. 老毛桃还原windows server 2012 R2服务器
  10. 三菱FX5U系列PLC模拟量使用方法及相关参数设置