Android中的NDK(二)
来源:互联网 发布:人工智能语音计算器 编辑:程序博客网 时间:2024/05/02 01:31
JNI Reference
其实是对jobject的分类
局部引用 LocalRef 本地方法栈内有效 全局引用 GlobalRef 虚拟机全局生效 不会被GC回收 若全局引用 WeakGlobalRef 虚拟机全局生效 GC时被回收
以下全都是局部引用:
局部引用最大数量为512个,可能会产生内部泄漏
建议采用下面这种方式
(*env)->PushLocalFrame(env,3); jobject localobj1 = (*env)->NewLocalRef(env,message); jobject localobj2 = (*env)->NewLocalRef(env,message); jobject localObj3 = (*env)->NewLocalRef(env,message); jobject localObj4 = (*env)->NewLocalRef(env,message); (*env)->PopLocalFrame(env,NULL);
GlobalReference
//声明全局引用 jclass cls = (*env)->FindClass(env,"android/os/Message"); globalCls = (*env)->NewGlobalRef(env, cls); //删除全局引用 (*jvm)->GetEnv(jvm,(void**)&env,JNI_VERSION_1_6); if(globalCls!=NULL) { (*env)->DeleteGlobalRef(env, globalCls); }
//全局化field和methodId whatField = (*env)->GetFieldID(env,cls,"what","I"); obtainMethod =(*env)->GetStaticMethodID (env,cls, "obtain","()Landroid/os/Message;");
初始化
jint JNI_OnLoad(JavaVM* jvm, void* reserved) { JNIEnv* env = NULL; if((*jvm)->GetEnv(jvm,(void**)&env,JNI_VERSION_1_6)!=JNI_OK){ return JNI_ERR; } //声明全局引用 jclass cls = (*env)->FindClass(env,"android/os/Message"); globalCls = (*env)->NewGlobalRef(env, cls); //全局化field和methodId whatField = (*env)->GetFieldID(env,cls,"what","I"); obtainMethod =(*env)->GetStaticMethodID (env,cls, "obtain","()Landroid/os/Message;"); jclass jnDemoClass = (*env)->FindClass(env,classPathName); //通过registerNatives调用 (*env)->RegisterNatives(env,jnDemoClass,methods, sizeof(methods)/sizeof(methods[0])); return JNI_VERSION_1_6;}
void JNI_OnUnload(JavaVM* jvm, void* reserved){ JNIEnv* env = NULL; (*jvm)->GetEnv(jvm,(void**)&env,JNI_VERSION_1_6); if(globalCls!=NULL) { (*env)->DeleteGlobalRef(env, globalCls); } whatField= NULL; obtainMethod = NULL; }
registerNative
//创建一个jni与java的关联表static JNINativeMethod methods[] = { {"changeMessageWhatInNative","(Landroid/os/Message;)V", (void*)changeMessageWhatInNative }, {"getMessageFromNative","()Landroid/os/Message;", (void*)getMessageFromNative },}; //通过registerNatives调用,一次registerNative只能注册一个class (*env)->RegisterNatives(env,jnDemoClass,methods, sizeof(methods)/sizeof(methods[0]));
0 0
- Android中的NDK(二)
- Android NDK编程(二)
- Android中的NDK(一)
- Android studio NDK成长记录(二)ndk-build
- Android NDK入门(二) -- STL
- Android NDK 开发之(二) 牛刀小试
- Android NDK 开发之(二) 牛刀小试
- 二---Android-NDK系列文章(1)
- Android NDK开发学习(二)
- Android NDK开发(二)数组
- Android——NDK开发(二)
- Android NDK(二):配置CMakeList文件
- Android NDK日志篇(二)
- Android学习笔记-NDK开发(二)
- Android ndk 之二
- Android ndk 之二
- android ndk开发二
- android studio 中的NDK开发(1)
- java字符流
- Yii2 创建项目
- 文章标题
- 如何做好软件项目策划
- 博为峰Java技术文章 ——JavaSE Swing 按钮组件的综合运用
- Android中的NDK(二)
- bzoj 2178: 圆的面积并 (辛普森积分)
- maven常见问题汇总
- Git push 常见用法
- SQL server 触发器实例讲解
- 毕业第一年,年底小记
- 一个实现智能指针的例子《还不完善》
- 怎样将jar包上传到Sonatype Nexus仓库
- Maximal Square