Android JNI之JAVA与C++对象建立对称关联(JNI优化设计,确保JNI调用的稳定性)
转载请声明:原文转自:http://www.cnblogs.com/xiezie/p/5930503.html
Android JNI之JAVA与C++对象建立对称关联
1.JAVA对象持有C++对象的指针
- 在JAVA类中创建一个int类型的变量(如int mObj),用于储存C++对象的指针
 - 在创建C++对象(如MyCPlusObj)的本地方法中,将C++对象的指针存入JAVA变量中(mObj)
 
JNIEXPORT void JNICALL
Java_nativeMethod
(JNIEnv *env, jobject thiz) {
MyCPlusObj *obj = new MyCPlusObj();
jclass clazz = (jclass)(*env).GetObjectClass(thiz);
jfieldID fid = (jfieldID)(*env).GetFieldID(clazz, "mObj", "I");
(*env).SetIntField(thiz, fid, (jint)obj);
}
- 如果要取得C++对象,则通过mObj的获取C++对象的指针
jclass objClazz = (jclass)env->GetObjectClass(obj);//obj为对应的JAVA对象
jfieldID fid = env->GetFieldID(objClazz, "mObj", "I");
jlong p = (jlong)env->GetObjectField(obj, fid);
MyCPlusObj *cPlusObj = (MyCPlusObj *)p;
//cPlusObj 为JAVA对象对应的C++对象 
2.C++对象持有JAVA对象的引用
- 在C++类中创建一个jint类型的变量(如jint mObj),用于储存JAVA对象的引用
 - 在创建C++对象时,储存JAVA对象的引用
jobject gThiz = (jobject)env->NewGlobalRef(thiz);//thiz为JAVA对象
(*obj).javaObj = (jint)gThiz; 
Android JNI之JAVA与C++对象建立对称关联(JNI优化设计,确保JNI调用的稳定性)的更多相关文章
- 【我的Android进阶之旅】Android调用JNI出错 java.lang.UnsatisfiedLinkError: No implementation found for的解决方法
		
错误描述 今天使用第三方的so库时候,调用JNI方法时出现了错误.报错如下所示: 11-01 16:39:20.979 4669-4669/com.netease.xtc.cloudmusic E/a ...
 - Android使用JNI实现Java与C之间传递数据(转)
		
介绍Java如何将数据传递给C和C回调Java的方法. java传递数据给C,在C代码中进行处理数据,处理完数据后返回给java.C的回调是Java传递数据给C,C需要用到Java中的某个方法,就需 ...
 - Android JNI之JAVA调用C/C++层
		
转载请声明:原文转自:http://www.cnblogs.com/xiezie/p/5929996.html 一.java调用本地函数的开发步骤: 1.编写本地方法的类(可以说是用来叙述本地方法的类 ...
 - Android与JNI(二) ---- Java调用C++ 动态调用
		
目录: 1. 简介 2. JNI 组件的入口函数 3. 使用 registerNativeMethods 方法 4. 测试 5. JNI 帮助方法 6. 参考资料 1. 简介 Android与JNI( ...
 - Android数据库框架——ORMLite轻量级的对象关系映射(ORM)Java包
		
Android数据库框架--ORMLite轻量级的对象关系映射(ORM)Java包 事实上,我想写数据库的念头已经很久了,在之前写了一个答题系统的小项目那只是初步的带了一下数据库,数据库是比较强大的, ...
 - Android 通过 JNI 访问 Java 字段和方法调用
		
在前面的两篇文章中,介绍了 Android 通过 JNI 进行基础类型.字符串和数组的相关操作,并描述了 Java 和 Native 在类型和签名之间的转换关系. 有了之前那些基础,就可以实现 Jav ...
 - Android JNI访问Java成员
		
在 JNI 调用中,不仅仅 Java 可以调用本地方法,本地方法也可以调用 Java 中的方法和成员变量. Java 中的类封装了属性和方法,想要访问 Java 中的属性和方法,首先要获得 Java ...
 - Android NDK开发 JNI操作java构造方法,普通方法,静态方法(七)
		
Android NDK开发 JNI操作java普通.静态.构造方法 1.Jni实例化一个Java类的实例jobject 1.通过FindClas( ),获取Java类的的jclass 2.通过GetM ...
 - [转]ANDROID JNI之JAVA域与c域的互操作
		
本文讲述AndroidJava域与C域互操作:Java域调用c域的函数:c域访问Java域的属性和方法:c域生成的对象的保存与使用.重点讲解c域如何访问Java域. 虽然AndroidJNI实现中,c ...
 
随机推荐
- WCF 简单示例
			
WCF(Windows Communication Foundation,WCF)是基于Windows平台下开发和部署服务的软件开发包(Software Development Kit,SDK).WC ...
 - INSERT ... ON DUPLICATE KEY UPDATE Syntax
			
一 mybatis中返回自动生成的id 当有时我们插入一条数据时,由于id很可能是自动生成的,如果我们想要返回这条刚插入的id怎么办呢.在mysql数据中我们可以在insert下添加一个selectK ...
 - .net 生成拼音码与五笔码
			
首先加入配置文件: <?xml version="1.0" encoding="utf-8" ?> <CodeConfig> <S ...
 - apk反编译(7)用ProGuard混淆代码,初级防止反编译
			
eclipse为例 1,project.properties去掉 #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:pro ...
 - C#ShowCursor光标的显示与隐藏
			
使用using System.Runtime.InteropServices; [DllImport("user32.dll" , EntryPoint = "Sho ...
 - C#6.0  VS2015
			
https://msdn.microsoft.com/en-us/library/hh156499(v=vs.140).aspx This page lists key feature names f ...
 - useradd和adduser的区别
			
1. 在root权限下,useradd只是创建了一个用户名,如 (useradd +用户名 ),它并没有在/home目录下创建同名文件夹,也没有创建密码,因此利用这个用户登录系统,是登录不了的,为了 ...
 - topcoder srm 628  div2 250 500
			
做了一道题,对了,但是还是掉分了. 第二道题也做了,但是没有交上,不知道对错. 后来交上以后发现少判断了一个条件,改过之后就对了. 第一道题爆搜的,有点麻烦了,其实几行代码就行. 250贴代码: #i ...
 - CodeForces 474.D Flowers
			
题意: 有n朵花排成一排,小明要么吃掉连续的k朵白花,或者可以吃单个的红花. 给出一个n的区间[a, b],输出总吃花的方法数模 109+7 的值. 分析: 设d(i)表示吃i朵花的方案数. 则有如下 ...
 - U盘启动格式
			
U盘的几种启动模式:USB-HDD.USB-ZIP.USB-HDD+.USB-ZIP+.USB-CDROM 1. USB-HDD 硬盘仿真模式,DOS启动后显示C:盘,HP U盘格式化工具制作的U盘 ...