我们通过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);

资源下载地址   :http://download.csdn.net/detail/brightshadow11111/5947267

jni java和C之间的值传递(int String int[])的更多相关文章

  1. WP8:Unity3D之间的值传递

    在前面的讨论中,我们介绍了如何在Unity3D for WP8中使用高于.Net 3.5的第三方库,传送门:http://www.cnblogs.com/zhxilin/p/3311240.html ...

  2. java参数传递时到底是值传递还是引用传递

    java参数传递时到底是值传递还是引用传递(baidu搜集) 问”,很多人的BLOG里都引用这些面试题,最近因为工作内容比较枯燥,也来看看这些试题以调节一下口味,其中有一道题让我很费解. 原题是:当一 ...

  3. Backbone中父子view之间的值传递

    backbone中,使用最多的莫过于在view中进行操作,如模板的渲染以及事件函数的定义.为了提高代码的可维护性,一般地我们会写多个视图即view,将界面按照功能的不同进行模块化划分,模块与view一 ...

  4. 通过$broadcast或$emit在子级和父级controller之间进行值传递

    通过$broadcast或$emit在controller之间进行值传递,不过这些controller必须是子级或者父级关系, $emit只能向父级parent controller传递事件event ...

  5. vue.js 同级组件之间的值传递方法(uni-app通用)

    vue.js 兄弟组件之间的值传递方法 https://blog.csdn.net/jingtian678/article/details/81634149

  6. Vue父子之间的值传递

    将通过两个input框实现父子之间的值传递作为演示,效果图 先注册父子各一个组件,代码如下 <div id="app"> <parent></pare ...

  7. Java中传参的值传递和引用传递问题(转)

    今天遇到了一个java程序,需要用参数来返回值(虽然最后用另一种方法实现了),在网上看到这样一篇文章,很受启发. 本文章来自于http://hi.baidu.com/xzhilie/blog/item ...

  8. Java的参数传递是「值传递」还是「引用传递」?

    关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题. 有人说Java中只有值传递,也有人说值传递和引用传递都是存在的,比较容易让人产生疑问. 关于值传递和引用传递其实需要分情况看待. ...

  9. Java中不得不谈的值传递和地址传递

    个人的一些认识,希望能对初学Java的你,或者困惑于方法参数传递的你祈祷一丝帮助! 下面是一些作者的个人观点,如果有错,欢迎各位大牛指出错误,灰常感谢您的观看与支持... -------------- ...

随机推荐

  1. cos-26上传个人案例

    package cn.gdpe.upload; import java.io.File;import java.io.IOException;import java.util.Enumeration; ...

  2. 关于考虑浏览器兼容性时间的工具demo

    //支持跨浏览器的添加事件. var btn = document.getElementById("btn"); function showMes() { alert(" ...

  3. JQUERY1.9学习笔记 之属性选择器(一) 前缀选择器

    描述:选择指定属性值的元素,或者是以字符串开始其后跟随“-”符号的. jQuery( "[attribute|='value']" ) 例:查找出所有语言属性为en的链接. < ...

  4. MBR

    Mbr位于磁盘的0柱面,0磁头,1扇区. MBR       有三部分构成,主引导程序,硬盘分区表DPT和,硬盘的有效标志55AA.在512个字节的主引导扇区里. 主引导程序占446个字节,dpt占6 ...

  5. 【python常用模块】os.path

    os.path.abspath(path) #返回绝对路径 os.path.basename(path) #返回文件名 os.path.commonprefix(list) #返回list(多个路径) ...

  6. bzoj2395: [Balkan 2011]Timeismoney

    Description      有n个城市(编号从0..n-1),m条公路(双向的),从中选择n-1条边,使得任意的两个城市能够连通,一条边需要的c的费用和t的时间,定义一个方案的权值v=n-1条边 ...

  7. BZOJ 3893 Cow Jog

    Description The cows are out exercising their hooves again! There are \(N\) cows jogging on an infin ...

  8. BZOJ 1009 GT考试

    Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学A1A2...Am(0< ...

  9. 45 Useful JavaScript Tips, Tricks and Best Practices(有用的JavaScript技巧,技巧和最佳实践)

    As you know, JavaScript is the number one programming language in the world, the language of the web ...

  10. Gvim各种插件配置(windows环境下)

    1.Vundle插件:https://github.com/gmarik/Vundle.vim 用于管理Vim插件,安装此插件需要系统中已安装git,参考链接:Git for Windows安装和基本 ...