android jni 结构体_Android应用开发Android JNI-c/c++调用java方法

本文将带你了解Android应用开发Android JNI-c/c++调用java方法,希望本文对大家学Android有所帮助。

"

Android   JNI-c/c++调用java方法,在使用ndk开发的时候,java调用c/c++方法是必须要的。但是很多时候,c/c++有callback需要反馈给java的时候(比如IM通讯登录成功信息和一些异常信息),就需要c/c++调用java方法了。

在看这篇文章之前,必须对JNI有一些基础的了解,比如java调用c/c++方法,java和c/c++   jni在一些基本类型上的对应(int对应jint等)。

那么现在介绍一下c/c++调用java方法的基本步骤:

1.需要把java方法所在类的实例通过JNI方法传到c/c++

java:JNI, 这是c需要回调的java方法,然后通过调用自身init()方法,把java实例传到c层

?

1

2

3

4

5

6

class JNI {

public native void init(JNI obj);

public void error(int code) {

Log.i(""JNI"", ""c++ call error   "");

}

}

c:这里把java传递进来的objListener,保存到c的jniobj结构体内。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

JNIEXPORT jint JNICALL Java_com_arcvideo_rtcmessage_JNI_init(

JNIEnv *env,

jobject oj,

jobject objListener,

)

{

if(objListener == MNull){

MVLOG(""objListener is null"");

}else

{

MVLOG(""get   java obj"");

jniobj->g_obj =   env->NewGlobalRef(objListener);

}

return res;

}

typedef struct _tagJNIObj{//这个是刚才保存java实例的结构体,在还有其他参数

jmethodID JNI_error;

JavaVM* g_jvm;

JNIEnv* g_ThreadEnv;

jclass g_class;

jobject g_obj;

MHandle g_h;

}JNIObj;

static JNIObj* jniobj = MNull;

2.在c层拿到java class

c:通过jni提供的FindClass方法和完整类名,可以拿到class引用

?

1

2

static const char* const DL_CLASS_NAME =   ""com/arcvideo/rtcmessage/JNI"";

jniobj->g_class = env->FindClass(DL_CLASS_NAME);

3.在c层拿到java method

c:根据刚才拿到的java class引用有jni提供的GetMethodID方法,和方法名,入参,就可以拿到method引用

?

1

2

3

4

5

6

// error

jniobj->JNI_error =   env->GetMethodID(jniobj->g_class, ""error"",

""(I)V"");

if(jniobj->JNI_error ==   MNull){

MVLOG(""create   JNI_error is error"");

}

4.调用method

c:在需要调用的地方调用这个java方法,

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

static void error(MDWord code, MVoid* pObj)

{

MVLOG(""RtcMessageJNI   error is in code : %d"", code );

if(jniobj->g_ThreadEnv ==   MNull)

{

MVLOG(""attach   current thread start"");

jniobj->g_jvm ->   AttachCurrentThread(&jniobj->g_ThreadEnv, MNull);

if(jniobj->g_ThreadEnv ==   MNull){

MVLOG(""attach   current thread is error"");

return;

}

}

if(jniobj &&   jniobj->JNI_error){

MVLOG(""RtcMessageJNI error is called"");

//这里是最关键的调用过程,通过JNI提供的CallVoidMethod,来调用,加入参数,class引用,method应用,已经入参,这样调用java方法就完成了。

jniobj->g_ThreadEnv->CallVoidMethod(jniobj->g_obj,   jniobj->JNI_error,

(int)code);

}

if(jniobj->g_jvm){

MVLOG(""RtcMessageJNI error method   detach"");

jniobj->g_jvm->DetachCurrentThread();

jniobj->g_ThreadEnv =   MNull;

}

}

这里在调用java方法的时候调用了,AttachCurrentThread和DetachCurrentThread方法,这是必须的,如果不调用AttachCurrentThread就拿不到线程的引用,会报错误。然后在调用结束的时候要调用DetachCurrentThread,也就是释放线程。根据个人经验,最好每次调用java方法结束的时候都调用DetachCurrentThread,这样基本不会出错。

"

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/490074.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

word如何设置页眉横线的磅数

首先双击页眉,并选定横线 这样即为选中了横线 之后点击: 选择“边框与底纹” 之后按照下图设置即可

聚焦基础科学 引领未来发展

作者:姜桂兴 来源:光明日报当前,伴随着新一轮科技革命和产业变革的兴起,各国科技创新正在回到基础科学研究的根本问题上来。科学界意识到,技术创新背后的推动力是深层次的科学问题研究,只有聚焦基础问题研究…

python如何创建一个列表_在python中创建列表的最佳和/或最快方法

在python中,据我所知,至少有3到4种方法来创建和初始化给定大小的列表: 简单循环append: my_list []fori inrange(50):my_list.append(0) 简单循环: my_list []fori inrange(50):my_list [0] 列表理解: my_l…

maven 公共模块依赖_Maven 子模块 依赖 springboot 子模块的问题

package com.datayes.quantgraph.security does not exist子模块A 依赖 子模块 B,子模块B 是一个 springboot 项目。我们知道springboot 项目在打包的时候,使用的是org.springframework.bootspring-boot-maven-pluginspringboot 打包的时候 会有两种一个…

word页眉的横线怎么居中

有时候word插入的页眉的横线居然不是居中,是偏左的(好无语。。) 为了解决这个问题,首先双击页眉,选中当前页眉的所有内容 点击插入对齐制表符 此时横线处于居中状态了 但这时文字不居中了。。此时只需要将文字设成左…

pt-stalk

pt-stalk 1. 概述 在MySQL服务器出现短暂(5~30秒)的性能波动的时候,一般的性能监控工具都很难抓住故障现场,也就很难收集对应较细粒度的诊断信息。另外,如果这种波动出现的频率很低,例如几天才一次,我们也很难人为的抓…

阿里平头哥会和AMD一样成为令英特尔头痛的存在吗?

来源:与非网阿里巴巴通常被认为是中国最大的电子商务和云平台运营商。但是去年9月,这家科技巨头与一家名为平头哥的新子公司正式进入了芯片制造市场。此举是在阿里巴巴收购中国芯片制造商杭州中天微之后的几个月。平头哥将中天微与阿里巴巴自己的研发部门…

python变量类型之间转换_Python常用数据类型之间的转换总结

函数 描述 int(x [,base]) 将x转换为一个整数 long(x [,base] ) 将x转换为一个长整数 float(x) 将x转换到一个浮点数 complex(real [,imag]) 创建一个复数 str(x) 将对象 x 转换为字符串 repr(x) 将对象 x 转换为表达式字符串 eval(str) 用来计算在字符串中的有效Python表达式,…

extjs中store获取后台数据_Excel实战技巧64: 从工作簿中获取数据(不使用VBA)

学习Excel技术,关注微信公众号:excelperfect这是在研读《Escape From Excel Hell》时学到的技术,从本工作簿中或者其他工作簿中获取所需要的数据,以便于作进一步的分析或者绘制Excel图表。下图1所示是用于获取数据的工作表。图1在…

5G都不能取代的Wi-Fi6,到底有多厉害?

来源:北京物联网智能技术应用协会蜂窝通信与WiFi,就像移动设备上的两大高手。彼此势均力敌:一个主室内,一个主室外。WiFi是移动网络的室内覆盖补充,也承担着大量的数据流量卸载,二者既想各自占山为王&#…

eclipseini设置使用的jdk_系统安全篇(四)-如何升级JDK版本?

最近在做项目时为保证系统安全,使用漏洞扫描工具对程序所在的设备进行安全漏洞扫描,发现了好多JDK的安全漏洞,为了对发现的这些漏洞进行修复,需要升级JDK版本。本章主要介绍如何升级JDK版本。第一步、从oracle官网下载JDK最新版本…

supervisord安装使用简记

What is supervisor Supervisor is a client/server system that allows its users to monitor and control a number of processes on UNIX-like operating systems. 引用自supervisor官网,中文意思就是是一个C/S架构的系统,用来监控管理类UNIX系统上进…

python文件读写方法手机_python读取文件—txt文件常用读写操作

txt文件的打开的两种方式:f open("data.txt","r") #设置文件对象f.close() #关闭文件为了方便,避免忘记close掉这个文件对象,可以用下面这种方式替代with open(data.txt,"r") as f: #设置文件对象str f…

ppt放映显示备注 投影不显示

点击设置幻灯片放映 勾选使用演示者视图 点击从当前幻灯片开始 在放映幻灯片过程中右键鼠标,点击显示演示者视图

懂数学人的都认同:数学的本质[关联]万物(一)

来源:数学职业家本文将会以数学为主线和切入点,进行一次思想和思维上的自由推理探索认知之旅,并将会透过一种有趣视角和观点,窥见一个我们所熟悉又有所不同的世界、万事万物和我们的宇宙。现在就让我们开始这次认知探索的旅程吧。…

python怎么做数据分析_如何用python进行数据分析

1、Python数据分析流程及学习路径 数据分析的流程概括起来主要是:读写、处理计算、分析建模和可视化四个部分。在不同的步骤中会用到不同的Python工具。每一步的主题也包含众多内容。根据每个部分需要用到的工具,Python数据分析的学习路径如下&#xff1…

Ruby 基础教程1-6

1.循环实现方法 循环语句 (while;for; loop,until)循环方法(times,each)2.for for 变量 in 对象主体end3.whilewhile 条件end4.until与while相反 条件不成立才进入循环体until 条件end5.循环控制break nextredo 重复执行当前循环,循环变量不变6.选择times 确定循…

redis实例python_生产消费者模式与python+redis实例运用(基础篇)

根据这个图,我们举个简单的例子:假如你去某个餐厅吃饭,点了很多菜,厨师要一个一个菜的做,一个厨师不可能同时做出所有你点的菜,于是你有两个选择:第一个,厨师把所有菜都上齐了&#…

一文告诉你,谷歌是否真的实现了「量子至上」

▲ 上图展示的是量子计算机系统中的一个组成部分(稀释制冷机),这张照片拍摄于2016年的一间无尘运行室。如果量子计算机真的能够以超越传统计算机的速度与效率完成某种计算,那么“量子至上”目标就算是真正达成。但是,这…