对象指针的保存

在上一章中,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之有必要的优化设计的更多相关文章

  1. Android JNI之JAVA与C++对象建立对称关联(JNI优化设计,确保JNI调用的稳定性)

    转载请声明:原文转自:http://www.cnblogs.com/xiezie/p/5930503.html Android JNI之JAVA与C++对象建立对称关联 1.JAVA对象持有C++对象 ...

  2. android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!从此在andrid中自由使用 图像匹配、识别、检测

    目录: 1,过程感慨: 2,运行环境: 3,准备工作: 4,编译 .so 5,遇到的关键问题及其解决方法 6,实现效果截图. (原创:转载声明出处:http://www.cnblogs.com/lin ...

  3. 【走过巨坑】android studio对于jni调用及运行闪退无法加载库的问题解决方案

    相信很多小伙伴都在android开发中遇到调用jni的各种巨坑,因为我们不得不在很多地方用到第三方库so文件,然而第三方官方通常都只会给出ADT环境下的集成方式,而谷歌亲儿子android studi ...

  4. Android游戏开发实践(1)之NDK与JNI开发03

    Android游戏开发实践(1)之NDK与JNI开发03 前面已经分享了两篇有关Android平台NDK与JNI开发相关的内容.以下列举前面两篇的链接地址,感兴趣的可以再回顾下.那么,这篇继续这个小专 ...

  5. JNI 备注

    本文记录一个基础的JNI例子及过程中遇到的问题解决. 1.定义一个JAVA类如下: package jnidemo01; public class JniHello { public native v ...

  6. Android游戏开发实践(1)之NDK与JNI开发01

    Android游戏开发实践(1)之NDK与JNI开发01 NDK是Native Developement Kit的缩写,顾名思义,NDK是Google提供的一套原生Java代码与本地C/C++代码&q ...

  7. Android游戏开发实践(1)之NDK与JNI开发02

    Android游戏开发实践(1)之NDK与JNI开发02 承接上篇Android游戏开发实践(1)之NDK与JNI开发01分享完JNI的基础和简要开发流程之后,再来分享下在Android环境下的JNI ...

  8. 关于jni编译32位、64位动态库(Android.mk和Application.mk文件)

    最近新项目需要编译64位的动态库,这里记录如何配置. 在jni目录下加入Android.mk和Application.mk文件. Application.mk APP_ABI := armeabi a ...

  9. android JNI 调用NDK方法

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

随机推荐

  1. Python Tutorial 学习(四)--More Control Flow Tools

    4.1 if 表达式 作为最为人熟知的if.你肯定对这样的一些表达式不感到陌生: >>> x = int(raw_input("Please enter an intege ...

  2. 【转】C#正则表达式详解

    正则表达式通常包含字母文本(Literaltext)和元字符(metacharacter) 字母文本指的是普通文本如"abcde"可匹配字符串中任何包含"abcde&qu ...

  3. C语言连接MySql数据库

    C语言连接MySql数据库(CodeBlocks) 操作系统:Windows7(32位)编译软件:Code::Blocks 10.05数 据 库:mysql-5.1.62-win32 数据库内的数据: ...

  4. Caption,Text,WindowText的区别——TControl也有FText,是为了模拟一个窗口

    TControl = class(TComponent) // 控件的Windows功能从TControl开始 property Caption: TCaption read GetText writ ...

  5. UpdateLayeredWindow是炫效果的关键

    自绘——是的,输入框每个字都自己绘制,计算行宽,行高,模拟光标闪烁,处理输入法的各种事件,以及选中,拖动等功能. 支持支持一下,实际上无句柄的,就是多行富文本编辑比较麻烦,其他的,都不复杂.很容易实现 ...

  6. c++实现委托

    #include "stdafx.h" #include <iostream> #include <string> using namespace std; ...

  7. 在Win7下用XManager远程控制ubuntu

    在Win7下用XManager远程控制ubuntu   远程主机通过xdmcp协议连接到ubuntu的图形终端,以图形终端方式登录. 远程主机是win7.ubuntu装在VMware虚拟机上,ubun ...

  8. 字符串(后缀数组||SAM):NOI2015 品酒大会

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAByIAAALuCAIAAABtq0bwAAAgAElEQVR4nOy9f2wb150vev4boESeln ...

  9. 《A First Course in Probability》-chaper5-连续型随机变量-均匀随机变量

    在连续随机变量这部分,有一种特殊的随机变量X,对于X所有可能取值,P(X)都相等,我们称其为均匀随机变量. 基于均匀随机变量的定义,我们容易看到,其密度函数f(x)必然是一条平行于x轴的直线,因为这样 ...

  10. hdu 4608 I-number 大整数

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4608 #include <cstdio> #include <cmath> # ...