C转换jni类型

2019-04-21 15:52来源:未知
什么情况下,c的基本类型要转成jni类型呢?就是你的c的数据,要传给java的时候。比如说,返回值:c语言的函数对应的是java的本地函数,它有一个返回值,你就必须在c里面要返回给

  什么情况下,c的基本类型要转成jni类型呢?就是你的c的数据,要传给java的时候。比如说,返回值:c语言的函数对应的是java的本地函数,它有一个返回值,你就必须在c里面要返回给java。这种情况,我们首先应该定义的是c的类型,把这个c的类型转成jni类型返回去,java就可以接收了。

  然后,这里看一看准备好的本地函数:(这里一共有8个本地函数)它们的返回值,分别对应的是java的8个基本数据类型。本地函数的具体实现,就该由c来实现。

  而c在实现的时候,它的返回类型,就根据这个JNI和c的基本数据类型对照表:

  我们用实际的例子来说话。我们先同样利用Simple这个项目作为模板,创建一个名为NDKTest4的新项目。

  我们打开该项目的MainActivity主Activity文件,然后将之前提供的已写好的本地函数:

  这是该项目的主配置文件:这里有一个TextView和一个Button,之前我们都只是运用到了Button,这次我们多取出一个TextView,也运用到。取出来之后,我点击按钮,把上面这些本地函数都调用,然后将它们的返回值都显示到TextView上去。

  然后为Button按钮设置点击事件的监听,这个类也要实现点击事件的接口:

  然后,我们在点击事件里面调用了申明的8个本地函数,同时定义了一个string类型的变量,用于将这8个函数的返回值拼接成字符串,中间用冒号隔开:

  Java的代码书写完毕,接下来就是c语言中的代码了。首先,我们得在项目中新建一个jni文件夹:

  然后,我们就开始写c语言函数,这里的c语言函数有点儿多,所以如果上课写的话就太浪费时间了,所以我这里已经提前写好了,可以节约大家看的时间:

  函数名:先是java开头,然后是包名,再然后是类名,最后是方法名。那,这里为什么用char呢?

  Byte类型的java数据,对应的c类型就是char。所以按照这张表来一一对应。丹东解太湖当然,如果对应的c语言类型是数值型的话,就可以用一个大一点儿范围的数值型来接收,比如:int的范围就比unsigned char范围大,就可以代替unsigned char。然后,这里转换,是把char类型转换成jni类型:

  因为c语言的char类型就是jni的jbyte类型,所以直接赋值就行了,甚至你这里直接返回y都是可以的。以下的方法都是同样的道理。但是,我们这里在返回jlong的方法里面,在定义long类型时,只需要一个long就可以了,因为我这个电脑是64位的系统:(所以说这个long型已经占了64位)当然,如果说是32位的系统线位,此时就需要long long了。

  然后,这个返回的是布尔值,根据对照表,我们知道:unsigned char就对应jni的jboolean。我们知道,当我们从java当中传过来的是布尔值的时候:如果是true,那么c语言里面接收到的是1;如果是false,那么c语言接收到的是0;但是我们这里定义的是一个 不为 0 和 1 的255数值,那么该返回的布尔值是什么呢?其实在是这样定义的:在unsigned char这个范围内,只要不为0,都表示true;即只有0表示false。

  这里我们补上之前在java代码里忘掉的一步,我们之前得到了TextView这个控件,可是还没有把得到的返回值显示在TextView上面,所以我们这里这样写:

  C语言写好之后,我们应该把它弄成动态库,弄成动态库之前,我们应该写好配置文件。分别修改为要加载的动态库的名字、c语言源文件的文件名。这里我们就不用改了,因为取得名字都和配置文件里的一样。

  我们可以看见,这里出了点错。我们检查一下代码,这里出的错误是:找不到jni目录下的这个Test.c的文件。它去找这个Test.c文件是因为这里配置的是这个文件名:

  那么为什么会找不到呢?因为我们这里写的是Text.c,而不是Test.c。

  那两边任意一个地方改一下就可以了,这里我们选择改变文件名为:Test.c。

  刷新之后,动态库就被eclipse加载显示出来了,此时我们就可以运行程序来测试一下了:

  这就是运行后的界面效果,最上面显示了一个TextView,然后之下是一个Button按钮。

  然后我们点击Button,就可以发现数据全部都来了:(显示在了TextView里面了)。

  我们这里的java一系列的本地函数都是有返回的,全都是java的基本数据类型。所以我们的c语言函数,就应该用对应的jni类型作为返回值。而C语言要得到jni类型是怎么来的呢?它是先声明一个c类型。然后再把c类型转成jni类型。再把jni类型返回,java那边自然就可以接收。Java接收之后,我们再把它全部拼接到字符串里面。然后一次性把它显示在TextView上面。

  没收到,您可以查看您的垃圾邮件和被过滤邮件,也可以再次发送验证邮件(60s)

编辑:admin
关键词: