JNI之有必要的优化设计
对象指针的保存
在上一章中,c函数中将会获取的一些值,例如:FieldID、MethodID、jclass等数据。这些数据如果定义在函数内部,在函数返回时就会丢失。很多时候,在java与c的多次交互中,会在不同函数间使用相同的变量,而变量的值必须保持一致。因此,就必须对这些通用变量做储存。
之前的做法是将其保存为全局变量,即直接将变量定义在函数外面。其中包括了当前对象指针thiz和其对应的jclass。在java层,有可能新建多个对象来操作本地函数。即是,运行时产生的对象数量是未知的,有可能多次的本地函数调用产生多个thiz和jclass变量。然而全局变量是静态的,在编译时就定义了数量和大小,新进变量会不断覆盖原有的变量。这种情况在单线程环境中虽然麻烦,但还控制的住。一旦多个java线程进入本地函数,将会导致线程冲突问题。也就是说这样的设计是不合理、不稳定的。
针对这个问题的优化方法之一是直接将那些在运行时产生变量保存在java或c++的对象中,动态的变量归动态的对象管,c模块只是做好静态的、通用的处理。这样既保持了c模块的稳定和复用,也使结构清晰高效。
设计细节
1)、java对象和c++对象中含有一个int类型的栏位,用于保存对方对象的指针。
2)、在c模块中,分别获取java对象和c++对象的指针,赋值到对方栏位上实现双向关联。
3)、java调用c++函数时,取关联中的c++对象传到c层
4)、调用c++的方法,实现功能。
*注意:当关联中的java对象的栏位定义为private,即不能直接取到java对象关联的c++对象时,可直接将关联中的java对象传到c层(若为当前对象则用thiz指针传递,非当前对象则用参数传递)。这种情况下在之前的setup阶段需保存栏位的FieldID到静态变量中,然后,进入本地函数后才能取到java对象中栏位中的值。
以上就是静态对静态,动态对动态的优化设计策略。
JNI之有必要的优化设计的更多相关文章
- Android JNI之JAVA与C++对象建立对称关联(JNI优化设计,确保JNI调用的稳定性)
转载请声明:原文转自:http://www.cnblogs.com/xiezie/p/5930503.html Android JNI之JAVA与C++对象建立对称关联 1.JAVA对象持有C++对象 ...
- android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!从此在andrid中自由使用 图像匹配、识别、检测
目录: 1,过程感慨: 2,运行环境: 3,准备工作: 4,编译 .so 5,遇到的关键问题及其解决方法 6,实现效果截图. (原创:转载声明出处:http://www.cnblogs.com/lin ...
- 【走过巨坑】android studio对于jni调用及运行闪退无法加载库的问题解决方案
相信很多小伙伴都在android开发中遇到调用jni的各种巨坑,因为我们不得不在很多地方用到第三方库so文件,然而第三方官方通常都只会给出ADT环境下的集成方式,而谷歌亲儿子android studi ...
- Android游戏开发实践(1)之NDK与JNI开发03
Android游戏开发实践(1)之NDK与JNI开发03 前面已经分享了两篇有关Android平台NDK与JNI开发相关的内容.以下列举前面两篇的链接地址,感兴趣的可以再回顾下.那么,这篇继续这个小专 ...
- JNI 备注
本文记录一个基础的JNI例子及过程中遇到的问题解决. 1.定义一个JAVA类如下: package jnidemo01; public class JniHello { public native v ...
- Android游戏开发实践(1)之NDK与JNI开发01
Android游戏开发实践(1)之NDK与JNI开发01 NDK是Native Developement Kit的缩写,顾名思义,NDK是Google提供的一套原生Java代码与本地C/C++代码&q ...
- Android游戏开发实践(1)之NDK与JNI开发02
Android游戏开发实践(1)之NDK与JNI开发02 承接上篇Android游戏开发实践(1)之NDK与JNI开发01分享完JNI的基础和简要开发流程之后,再来分享下在Android环境下的JNI ...
- 关于jni编译32位、64位动态库(Android.mk和Application.mk文件)
最近新项目需要编译64位的动态库,这里记录如何配置. 在jni目录下加入Android.mk和Application.mk文件. Application.mk APP_ABI := armeabi a ...
- android JNI 调用NDK方法
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...
随机推荐
- 项目知识点.Part2
1. 取消collectionView头视图重叠情况:以下两种情况效果一样 但是有一点点bug 每次remove之后 需要把视图刷到上面才会显示(后续会改进方法) for (UIView *view ...
- centos 下vmware 下添加硬盘到root
### #vmware 里找到硬盘拖大点...,如果不想从启动么,添加个新 #的也行.不过那个是另外的方法了 ### #### ##找下硬盘添加在哪里 #### fdisk -l //创建分 ...
- 访问Github过慢解决
在这个地址查找响应最快的地址:http://tool.chinaz.com/dns?type=1&host=assets-cdn.github.com&ip= 查找:assets-cd ...
- iOS开源项目
在结束了GitHub平台上“最受欢迎的Android开源项目”系列盘点之后,我们正式迎来了“GitHub上最受欢迎的iOS开源项目”系列盘点.今天,我们将介绍20个在GitHub上非常受开发者欢迎的i ...
- MC中间件WCCS
一.问题描述 在大访问量的Web服务中,MC集群作为缓解后端数据源访问压力的中间层已经成为了不可缺少的一部分,机器数量越来越大,维护成本也变得越来越高了,其中的问题有: 故障机器自动剔除.后端某台MC ...
- ios入门之c语言篇——基本函数——2——判断闰年
2.闰年判断 参数返回值解析: 参数: a:int,年份: 返回值: 1:闰年: 0:非闰年: int leapyear(int a) { ==) { ; } ==) { ; } ==) { ; } ...
- zabbix 添加jvm监控
1. zabbix 服务端安装,监控jmx 需要--enable-java zabbix 客户端不需要 --enable-java 2.zabbix_server端安装jdk 安装jdk [root@ ...
- 【HDOJ】2451 Simple Addition Expression
递推,但是要注意细节.题目的意思,就是求s(x) = i+(i+1)+(i+2),i<n.该表达中计算过程中CA恒为0(包括中间值)的情况.根据所求可推得.1-10: 31-100: 3*41- ...
- bzoj2006
论将区间和转化为前缀和的重要性这题一旦转化为前缀和就非常明了了一段区间[l,r]的美妙程度就等于s[r]-s[l-1]对于这种无法计算出所有方案而取前k大的题目,我们一般分类别然后利用类别内的单调性用 ...
- 数位DP:SPOJ KPSUM - The Sum
KPSUM - The Sum One of your friends wrote numbers 1, 2, 3, ..., N on the sheet of paper. After that ...