C++ ,JNI, Java 数据传递全解(一)
创始人
2024-05-31 12:45:31
0

在讲正题之前,先说一下C++,JNI和Java 对应的数据类型对比吧,废话不多说,直接上图

上面为C++,Java,JNI 三者只见对应的数据类型

好了,现在我们有了上面的数据类型比对,下面就讲讲从C++如何将数据传递给Java吧

  • 1,如果想要从C层,传递信息给Java,那首先需要在java层定义一个方法,用来接收从C层传递过来的信息,例如

public void onEvStationRoute(int count,boolean isTrue,long handlerID,Route route,EvExpectedRange evExpectedRange){}

上面就是在java层定义的一个方法,用来接收C++层的数据信息,上面的方法中,有四个参数,分别是int类型,boolean类型,Object类型,此处特别声明一点,EvExpecteRange 内部我特意定义两种数据类型,List和Date(时间),后面会细讲。

  • 2,定义完java层后,我们就需要在C层做手脚了。首先,想要与java端通信,需要获取一个唯一的id,在C++里面,想要与Java通信,肯定离不开JNI,所以,这个唯一的ID,我们就把他称为jmethodID。

代码如下

 jmethodID m_route_ev_station = env->GetMethodID(routerClass, "onEvStationRoute","(IZJLcom/auto/navigation/routing/Route;Lcom/auto/navigation/routing/EvExpectedRange;)V");

解释一下上面的GetMethodId的几个参数。

第一个参数是需要知道方法所在的类,获取的方法如下

jobject m_router_obj = env->NewGlobalRef( instance );//instance是从JNI层传过来的Jobject
jclass routerClass = env->GetObjectClass( m_router_obj );

此时,得到了需要通信的方法所在的类。

第二个参数是我们之前在java层定义的方法名。第三个参数,就是我们方法中的几个形参的数据类型,可以看到我们在java中定义的参数类型顺序依此是int,boolean,long,object,object,那对应的c++类型则是上方定义的几个数据类型,需要说明一下,object的类型,是在java中定义的几个bean类,类似于json信息的解析。此处分别定义了Route和EvExpectedRange两个bean类。

  • 3,好了,定义好方法的唯一ID之后,我们就需要考了一下如何使用他了。代码如下:

jenv->CallVoidMethod(m_router_obj, m_route_ev_station,
(jlong)id,
(jint) count,
(jboolean) isTrue, 
routeObj,
routeEvRangeObj);

解释一下上方的代码,

  1. 首先jenv,他是JNI中独有一种对象JNIEnv,内部封装了很多很多的方法,感兴趣的同学,可以去看一下他的源码,我们在这里就不解释了,直接看看如何拿到他吧。

JNIEnv *jenv;// Get the Environment status.int getEnvStat = gJavaVM->GetEnv((void **) &jenv, JNI_VERSION_1_6);
// If current is not attached to main thread, attache it.if (getEnvStat != JNI_OK) {gJavaVM->AttachCurrentThread(&jenv, nullptr);}

切记,通过以上代码就可以得到jenv的对象指针,但是一定要判断getEnvStart的状态,考虑到线程的合并问题,就是第五行和第六行的内容。如果不加这两句话,多线程出现的情况下,很有可能会崩溃的。

  1. 拿到jenv对象指针后,调用CallVoidMethod方法,传入参数就可以将需要的信息传递给java层了。是不是很简单?别急,我们还没有说callVoidMethod内部的几个参数呢。

  1. 第一个参数,就是一个jobject对象,这个对象是从该方法对应的java类传过来的,上面我们已经说过m_router_obj是怎么来的了。

  1. 第二个参数,我们也讲过他的来历了,他是唯一的方法标识ID

  1. 第三个参数到第五个参数,都是基础的数据类型,这里我们可以将基础的数据类型直接强转一下,C++和JNI是可以接收这样的方式的

  1. 重点来了,我们如何传递jobject数据类型,即我们怎么传递第六个参数和第七个参数?请看第二篇博客哦。

相关内容

热门资讯

华为手机系统和安卓,打造独特体... 你有没有发现,最近华为手机在市场上可是越来越火了?这不,我就来跟你聊聊华为手机系统和安卓的那些事儿,...
安卓打不开系统软件,安卓系统软... 最近是不是你也遇到了安卓手机打不开系统软件的尴尬情况?别急,让我来给你详细说说这个问题的原因和解决方...
安卓系统哪个管家好,哪款管家更... 手机里的安卓系统,就像一个热闹的大家庭,每个人都在寻找那个最贴心的管家。那么,安卓系统里哪个管家最好...
忧思安卓系统升级,探索新功能与... 最近手机又闹腾起来了,不是闹铃,而是安卓系统升级的闹钟。你有没有和我一样,一边期待着新功能的到来,一...
华为手表连接安卓系统,智能生活... 你有没有发现,最近华为手表在科技圈里可是火得一塌糊涂呢!这不,我就来给你好好聊聊这款神奇的小玩意儿—...
网络版电视安卓系统,网络版电视... 你有没有发现,现在看电视的方式都变了?没错,就是那个我们每天离不开的屏幕,它已经悄悄地升级换代了。今...
安卓手机虚拟小米系统,功能与体... 你有没有想过,你的安卓手机里竟然可以装上小米的操作系统?没错,就是那个以简洁和高效著称的小米系统!今...
oppo 安卓9.0系统好吗,... 最近手机圈可是热闹非凡呢!OPPO新推出的这款手机,搭载了安卓9.0系统,不少小伙伴都在问:这安卓9...
安卓9和10系统对比,功能升级... 你有没有发现,手机系统更新换代的速度简直就像小孩子的成长一样快?这不,安卓9和10系统已经悄悄地走进...
华为平板系统切换安卓,体验全新... 你有没有发现,最近华为平板的新鲜事儿可不少呢!听说他们家的新系统切换到了安卓,这可真是让人眼前一亮啊...
小米note安卓5.0系统下载... 你有没有发现,小米Note这款手机真的是越来越受欢迎了呢?尤其是它的安卓5.0系统,简直让人爱不释手...
安卓系统90怎么样,革新体验与... 你有没有听说安卓系统90的最新版本啦?这可是最近科技圈的大热门呢!今天,我就来给你详细聊聊这个安卓系...
国内安卓系统哪家好,国内安卓系... 你有没有想过,手机里的安卓系统就像是我们生活中的各种品牌,各有各的特色和魅力呢?今天,就让我带你来一...
安卓系统的大小设置方法,安卓系... 手机里的安卓系统是不是有时候让你觉得有点“庞大”,占用太多空间,让你想给它做个“瘦身”呢?别急,今天...
onda平板怎么安装安卓系统,... 你有没有想过,你的onda平板电脑也可以变身成安卓系统的超级战士呢?没错,就是那个你平时用来刷剧、玩...
安卓系统的数码相机,功能解析与... 你有没有发现,现在手机拍照已经成为我们生活中不可或缺的一部分呢?尤其是安卓系统的数码相机,简直让人爱...
王者荣耀安卓系统铭文,铭文搭配... 亲爱的王者荣耀玩家们,你是否在游戏中遇到过这样的困惑:明明操作很溜,但战绩却总是不尽如人意?别急,今...
安卓什么架构系统好点,探索最优... 你有没有想过,你的安卓手机里那个默默无闻的系统,其实是个超级重要的角色呢?它就像是你手机的灵魂,决定...
安卓系统怎么调日期显示,安卓系... 手机里的日期显示不对了?别急,我来教你一招,让你的安卓手机日期显示变得刚刚好!?一、打开设置,找到日...
苹果手机安卓系统功能 你有没有发现,最近身边的朋友都在讨论手机呢?尤其是苹果手机和安卓系统,简直是两大热门话题。今天,我就...