我们通过jni调用C代码不可能每次只是去调一个方法,通常,我们需要传递一些值过去。

例如,播放电影,那就肯定需要你把电影的 url给 C的播放器吧,等等。

接下来就看一看怎么去传递这些值:

首先是最简单的 int类型:

申明变量

//c实现两个数相加

public native int add(int x ,int y);

调用方法

//Java把两个int给c语言,c语言处理完还给java

int result = add(10,20);

Toast.makeText(this, result+ "", 0).show();

C代码实现

JNIEXPORT jint JNICALL Java_com_test_ndk3_MainActivity_add

(JNIEnv * env, jobject obj, jint x, jint y){

return x + y;

}

就是int成了  jint,没多大区别

下面看String

字符串就要麻烦很多了,JAVA调用方法和上面的一样,就不重复的写了,也没多大的意义

就看下不一样的地方

//将java字符串 转换成 c的字符串

char* Jstring2CStr(JNIEnv* env, jstring jstr)//zhang3.getBytes("gb2312");

{

char* rtn = NULL;

jclass clsstring = (*env)->FindClass(env,"java/lang/String");

jstring strencode = (*env)->NewStringUTF(env,"GB2312");

jmethodID mid = (*env)->GetMethodID(env,clsstring, "getBytes", "(Ljava/lang/String;)[B");

jbyteArray barr= (jbyteArray)(*env)->CallObjectMethod(env,jstr,mid,strencode); // String .getBytes("GB2312");

jsize alen = (*env)->GetArrayLength(env,barr);

jbyte* ba = (*env)->GetByteArrayElements(env,barr,JNI_FALSE);

if(alen > 0)

{

rtn = (char*)malloc(alen+1); //"\0"

memcpy(rtn,ba,alen);

rtn[alen]=0;

}

(*env)->ReleaseByteArrayElements(env,barr,ba,0); //

return rtn;

}

需要把java的字符串转成C的字符串

其他地方都差不多

就不赘述了,最后会把学习例子放上来大家参考

接下来是int数组

这里要注意的一点是 C中的指针概念,如果不明白,多看看

(JNIEnv * env, jobject obj, jintArray jintArr){

//得到数组元素信息(首元素的位置 ==== 数组的首地址) +10 得到数组的长度

//jsize (*GetArrayLength)(JNIEnv*, jarray);

//得到指定数组的元素的个数

jint len = (**env).GetArrayLength(env, jintArr);

//jint* (*GetIntArrayElements)(JNIEnv*, jintArray, jboolean*);

//得到指定数组中的元素信息

//jboolean* JNI_TRUE 1 复制 JNI_FLASE 0 引用(不复制)

//返回值: 得到数组元素后 数组的起始位置

jint* arr = (**env).GetIntArrayElements(env, jintArr, 0);

c java string转int_jni java和C之间的值传递(int String int[])相关推荐

  1. Java方法01 方法(函数)定义、调用、值传递、重载、命令行传递参数

    Java 方法的定义.调用.值传递.重载.命令行传递参数 1. 什么是方法? 2. 方法的定义和调用 3. 值传递和引用传递 4. 方法的重载 5. 命令行传递参数 6. 可变参数(输入参数的数量不确 ...

  2. java形参和实参的三种传递方式(值传递,地址传递,引用传递)

    博客 博客 值传递:对形参的修改不会影响到实参 引用传递:对形参的修改会影响实参 一.值传递 在主函数中 #include <iostream> using namespace std;v ...

  3. Java String 到底是引用传递还是值传递?

    对于非对象类型,java 参数传递都是值传递, 比如int. java 会直接复制一份值到方法参数里面去使用. 而对于对象类型,其实也是值传递,java 参数传递值的是对象的引用,相当于对象在堆里面的 ...

  4. java真的是值传递么?

    2019独角兽企业重金招聘Python工程师标准>>> 在java中我们在给方法传值时,真的是我们认为的值传递么?如果不是,那么是引用传递么? 其实在java中方法传值时,java的 ...

  5. java对象引用出错_“Java有值传递和引用传递”为什么错了?

    前言 初学Java的时候,老师在课堂上说"Java有值传递和引用传递",但网上"Java只有值传递"的呼声很高. 本人在查找资料的过程中,在这两个说法之间反复横 ...

  6. Java(4)---Java 对象和类

    Java 对象和类 Java作为一种面向对象语言.支持以下基本概念: 多态 继承 封装 抽象 类 对象 实例 方法 重载 本节我们重点研究对象和类的概念. 对象:对象是类的一个实例(对象不是找个女朋友 ...

  7. Java 学习笔记(9)——java常用类

    之前将Java的大部分语法都回顾完了,后面添加一些常见的操作,基础语法就结束了.至于在这里再次提到常用类是由于有一部分体现在使用它的继承类或者接口之类的.这些需要有面向对象编程的基础 Object类 ...

  8. java 数组传递是引用吗_数组是通过值传递还是通过Java引用传递?

    本问题已经有最佳答案,请猛点这里访问. Possible Duplicate: Is Java"pass-by-reference"? 数组不是Java中的原始类型,但它们也不是对 ...

  9. Java 是值传递还是引用传递

    最近整理面试题,整理到值传递.引用传递,到网上搜了一圈,争议很大.带着一脸蒙圈,线上线下查了好多资料.最终有所收获,所以分享给大家,希望能对你有所帮助.     首先说下我的感受,这个题目出的很好,但 ...

  10. Java学习系列(四)Java面向对象之修饰符、封装、继承、多态详解

    今天内容比较多,直接步入正题吧. 类和对象的定义 类是现实世界或思维世界中的实体在计算机中的反映,它将数据以及这些数据上的操作封装在一起.而对象是具有类类型的变量,存在于堆内存中.类是对象的抽象,而对 ...

最新文章

  1. python线上编辑问题_大型线上项目中动态语言诸多问题之二 -- 以 Python 语言为例...
  2. python分组函数_Python中如何按列分组和按自己的函数汇总
  3. Serverless 究竟是什么?
  4. android学习日记13--数据存储之ContentProvide
  5. 飞鸽传书2012是否发布了?
  6. 无线传感器网络 | 名词解释
  7. 2018年春季软件工程教学设计(初稿)
  8. 转载 webstrom识别 React语法
  9. [2019杭电多校第七场][hdu6646]A + B = C(hash)
  10. oracle比较日期大小函数输出,oracle 日期比较及惯用函数
  11. 计算机视觉的发展历程
  12. gopher对mysql的利用_gopher协议的攻击利用
  13. 广东省计算机一级技巧,广东省计算机一级
  14. Multi-Armed Bandits
  15. 来 看 T r i e 吧
  16. net以execl做数据库_基于C#.NET实现Excel数据导入数据库技术
  17. win7与VMware/VBox下linux共享文件夹方法
  18. 【ArcGIS for Android】使用自定义Callout显示地图信息
  19. 百度地图SDK无法定位到当前所在位置;一直显示天安门
  20. Python中布尔索引的使用

热门文章

  1. 模拟微信发红包算法java实现
  2. linux设备实现otg移动盘,Linux下通过OTG把板卡上的一个磁盘或文件映射成移动磁盘...
  3. C#网络编程----文件流
  4. python中用函数可以提高代码运行速度吗_为什么Python代码在函数中运行得更快?...
  5. mfc响应鼠标前进后退按键_诚意升级,商务大鼠再临:雷柏MT750S多模无线激光鼠标评测...
  6. win10修改服务器IP,Win10系统更改本地连接ip地址的方法
  7. Android的 线性布局,Android布局之LinearLayout线性布局
  8. kettle linux下的目录怎么看_Linux系统各目录下指令解析
  9. 宽带认证客户端_cisco PPPOE 服务端与客户端 配置命令
  10. tp3.2 生成二维码