Android NDK开发之旅14 JNI 缓存策略
###缓存策略
有两种:
####一、使用局部的static变量:
JNIEXPORT void JNICALL Java_com_test_JniTest_cache
(JNIEnv * env, jobject jobj){static jfieldID fid = NULL;jclass clz = (*env)->GetObjectClass(env, jobj);if (fid == NULL){fid = (*env)->GetFieldID(env, clz, "key", "Ljava/lang/String;");printf("fid inti once");}
}
复制代码
测试:
public native void cache();public static void main(String[] args) {JniTest test = new JniTest();for (int i = 0; i < 100; i++) {test.cache();}
}
复制代码
说明:
获取jfieldID只获取一次。局部静态变量只能在本方法的作用域中使用。
也可以搞个全局,但是fid不同函数可以使用,但是值不一样,值很难统一。因此官方推荐局部的。
局部静态变量的生命周期:
- 初始化,函数第一次执行
- 结束,作用域被销毁了,但是这个变量还会存在内存当中,直到程序结束。
####二、动态库加载的时候初始化全局变量
public static native void initIds();static {System.loadLibrary("JniTest");initIds();
}public static void main(String[] args) {JniTest test = new JniTest();for (int i = 0; i < 100; i++) {test.cache();}
}
复制代码
C代码如下:
//初始化两个全局变量,动态库加载完成之后,立刻缓存起来
//以后可以在其他函数使用,声明周期也是跟应用程序(进程)一致
jfieldID key_fid;
jmethodID random_mid;
JNIEXPORT void JNICALL Java_com_dongnaoedu_jni_JniTest_initIds(JNIEnv *env, jclass jcls){key_fid = (*env)->GetFieldID(env, jcls, "key", "Ljava/lang/String;");random_mid = (*env)->GetMethodID(env, jcls, "genRandomInt", "(I)I");
}
复制代码
如果觉得我的文字对你有所帮助的话,欢迎关注我的公众号:
我的群欢迎大家进来探讨各种技术与非技术的话题,有兴趣的朋友们加我私人微信huannan88,我拉你进群交(♂)流(♀)。
Android NDK开发之旅14 JNI 缓存策略相关推荐
- Android NDK开发之旅31 FFmpeg音频解码
###前言 #####基于Android NDK开发之旅30--FFmpeg视频播放这篇文章,我们已经学会视频解码基本过程.这篇文章就对音频解码进行分析. #####音频解码和视频解码的套路基本是一样 ...
- Android NDK开发之旅29 云服务器Ubuntu下搭建NDK环境,并编译FFmpeg
###前言 因为在Linux环境下编译FFmpeg生成库和头文件下比较方便,所以接下来主要操作在Linux环境下进行.但是对于Android NDK 开发新手来说,自己电脑配置Ubuntu Linux ...
- java 与jni转码,Android NDK开发之旅37--FFmpeg转码压缩
前言 Windows下命令行转码压缩形式 ffmpeg -i input.mov -b:v 640k output.mp4 Android也是利用FFmpeg命令行的形式(混编),进行视频转码压缩. ...
- Android NDK开发之旅1 NDK介绍
###一.NDK产生的背景 Android平台从诞生起,就已经支持C.C++开发.众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第三方应用都必须使用Ja ...
- Android NDK开发之旅25 NDK 模仿QQ变声特效
###前言 我们这次用到的是fmod这个库,fmod是音效引擎游戏开发革命引擎,著名的游戏开发引擎CosCos2D.U3D都封装了这个库. 学习NDK的目的就是为了让我们的APP能够使用C/C++开源 ...
- Android NDK开发之旅34 NDK 手把手带你入门直播技术
####前言 先来了解一下视频直播的基本架构: 我们需要有一个主播客户端进行音视频采集,压缩,然后通过RTMP协议进行推流,推到流媒体服务器,然后其他客户端统一从流媒体服务器引流,播放.关于这里的过程 ...
- Android NDK开发之 NEON基础介绍
原文:http://blog.csdn.net/app_12062011/article/details/50434259 Android NDK开发之 NEON基础介绍 这是官方介绍: http:/ ...
- Android NDK开发之 NEON使用介绍
首先找到了要在C源代码中只用NEON库需要的头文件 arm_neon.h. #include <arm_neon.h> //在代码中先添加了这行语句,然后执行ndk-build 却提示了错 ...
- android ndk neon,Android NDK开发之 NEON使用介绍
首先找到了要在C源代码中只用NEON库需要的头文件 arm_neon.h. #include //在代码中先添加了这行语句,然后执行ndk-build 却提示了错误 //提示要增加什么标志,自己在 L ...
最新文章
- C++类成员函数重载问题
- rhel6.3挂载HP-EVA6400磁阵--linux端操作流程
- JavaScript 技术篇-js代码获取当前操作系统信息、浏览器版本信息实例演示,windows NT版本对照表
- PHP生成Mysql数据字典
- 关于iOS沙盒的目录结构和获取
- Hbase数据倾斜问题处理手段汇总(持续更新中)
- spring学习(9):idea的config配置
- 1380C. Create The Teams
- GD32F103VET6替代STM32F103VET6遇到的问题
- 【机器学习】几种常见的有监督学习算法
- 【Algorithm】算法设计与分析(第二版)- 王红梅 - JAVA实现:3.2 分式化简。设计算法,将一个给定的真分数化简为最简分数形式。例如,将6/8化简为3/4
- powershell和cmd区别
- mysql batch insert_使用batch insert解决MySQL的insert吞吐量问题
- java计算出现负数吗,请问一个计算器的有关问题,怎么实现负数计算
- 车载网络: 常见车载网络
- Java 源码 - Socket 源码及面试题
- 怎么把图片存在mysql_如何把图片存储在mysql中
- Windows自带应用不能联网--巧用360断网急救箱
- java压缩包解压之后怎么安装_解压之后压缩包可以删除吗
- 两封邮件合并转发_用Python发送自定义电子邮件