• jni java和C之间的值传递(int String int[])


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







  • 相关阅读:
    [Python3网络爬虫开发实战] 3.1.3-解析链接
    pusher-http-go
    gopush-cluster 架构
    消息队列 redis vs nsq
    redis资料
    golang+websocket
    golang之flag.String
    Linux环境下安装mysql
    golang版的crontab
    golang实现wav文件转换为mp3文件
  • 原文地址:https://www.cnblogs.com/pangblog/p/3260614.html
Copyright © 2020-2023  润新知