###缓存策略

有两种:

####一、使用局部的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不同函数可以使用,但是值不一样,值很难统一。因此官方推荐局部的。

局部静态变量的生命周期:

  1. 初始化,函数第一次执行
  2. 结束,作用域被销毁了,但是这个变量还会存在内存当中,直到程序结束。

####二、动态库加载的时候初始化全局变量

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 缓存策略相关推荐

  1. Android NDK开发之旅31 FFmpeg音频解码

    ###前言 #####基于Android NDK开发之旅30--FFmpeg视频播放这篇文章,我们已经学会视频解码基本过程.这篇文章就对音频解码进行分析. #####音频解码和视频解码的套路基本是一样 ...

  2. Android NDK开发之旅29 云服务器Ubuntu下搭建NDK环境,并编译FFmpeg

    ###前言 因为在Linux环境下编译FFmpeg生成库和头文件下比较方便,所以接下来主要操作在Linux环境下进行.但是对于Android NDK 开发新手来说,自己电脑配置Ubuntu Linux ...

  3. java 与jni转码,Android NDK开发之旅37--FFmpeg转码压缩

    前言 Windows下命令行转码压缩形式 ffmpeg -i input.mov -b:v 640k output.mp4 Android也是利用FFmpeg命令行的形式(混编),进行视频转码压缩. ...

  4. Android NDK开发之旅1 NDK介绍

    ###一.NDK产生的背景 Android平台从诞生起,就已经支持C.C++开发.众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第三方应用都必须使用Ja ...

  5. Android NDK开发之旅25 NDK 模仿QQ变声特效

    ###前言 我们这次用到的是fmod这个库,fmod是音效引擎游戏开发革命引擎,著名的游戏开发引擎CosCos2D.U3D都封装了这个库. 学习NDK的目的就是为了让我们的APP能够使用C/C++开源 ...

  6. Android NDK开发之旅34 NDK 手把手带你入门直播技术

    ####前言 先来了解一下视频直播的基本架构: 我们需要有一个主播客户端进行音视频采集,压缩,然后通过RTMP协议进行推流,推到流媒体服务器,然后其他客户端统一从流媒体服务器引流,播放.关于这里的过程 ...

  7. Android NDK开发之 NEON基础介绍

    原文:http://blog.csdn.net/app_12062011/article/details/50434259 Android NDK开发之 NEON基础介绍 这是官方介绍: http:/ ...

  8. Android NDK开发之 NEON使用介绍

    首先找到了要在C源代码中只用NEON库需要的头文件 arm_neon.h. #include <arm_neon.h> //在代码中先添加了这行语句,然后执行ndk-build 却提示了错 ...

  9. android ndk neon,Android NDK开发之 NEON使用介绍

    首先找到了要在C源代码中只用NEON库需要的头文件 arm_neon.h. #include //在代码中先添加了这行语句,然后执行ndk-build 却提示了错误 //提示要增加什么标志,自己在 L ...

最新文章

  1. C++类成员函数重载问题
  2. rhel6.3挂载HP-EVA6400磁阵--linux端操作流程
  3. JavaScript 技术篇-js代码获取当前操作系统信息、浏览器版本信息实例演示,windows NT版本对照表
  4. PHP生成Mysql数据字典
  5. 关于iOS沙盒的目录结构和获取
  6. Hbase数据倾斜问题处理手段汇总(持续更新中)
  7. spring学习(9):idea的config配置
  8. 1380C. Create The Teams
  9. GD32F103VET6替代STM32F103VET6遇到的问题
  10. 【机器学习】几种常见的有监督学习算法
  11. 【Algorithm】算法设计与分析(第二版)- 王红梅 - JAVA实现:3.2 分式化简。设计算法,将一个给定的真分数化简为最简分数形式。例如,将6/8化简为3/4
  12. powershell和cmd区别
  13. mysql batch insert_使用batch insert解决MySQL的insert吞吐量问题
  14. java计算出现负数吗,请问一个计算器的有关问题,怎么实现负数计算
  15. 车载网络: 常见车载网络
  16. Java 源码 - Socket 源码及面试题
  17. 怎么把图片存在mysql_如何把图片存储在mysql中
  18. Windows自带应用不能联网--巧用360断网急救箱
  19. java压缩包解压之后怎么安装_解压之后压缩包可以删除吗
  20. 两封邮件合并转发_用Python发送自定义电子邮件

热门文章

  1. leetcode算法题--链表中的下一个更大节点★
  2. Go安装web框架revel
  3. 公网开放的plc设备——一种新型的后门
  4. 第一周(1.8-1.14)
  5. samba服务器详解
  6. 程序员的认知-中国程序员为什么跳槽
  7. 如何用敏捷消除项目风险?
  8. 在AngularJS应用中实现认证授权
  9. python机械臂仿真_VTK与Python实现机械臂三维模型可视化详解
  10. ifs 报表开发手册_房地产开发资质要求《暂定资质证书》相关规定