JNI中几种基本数据的处理方式
来源:互联网 发布:联想软件商店 编辑:程序博客网 时间:2024/05/17 00:14
C语言和JAV在数据类型的处理方式由于有的数据类型的字节数不同,在调用处理时可能会造成编译错误。
#include<stdio.h>#include<stdlib.h>#include<jni.h>#include<android/log.h>//#define LOG_TAG "System.out"#define LOG_TAG "lalalal"#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)/*使用是使用 LOGI("info\n"); LOGD("debug\n");*//* 将 String 类型转成 char**/char* Jstring2CStr(JNIEnv* env, jstring jstr){ 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); jsize alen = (*env)->GetArrayLength(env,barr); jbyte* ba = (*env)->GetByteArrayElements(env,barr,JNI_FALSE); if(alen > 0) { rtn = (char*)malloc(alen+1); //new char[alen+1]; memcpy(rtn,ba,alen); rtn[alen]=0; } (*env)->ReleaseByteArrayElements(env,barr,ba,0); return rtn;}/* 返回一个字符串*/JNIEXPORT jstring JNICALL Java_com_example_zhongtao_jniday13_Hello_helloInC(JNIEnv *env, jclass jobj){ char * str="I am ccc!!"; LOGD("string str==%s",str); return (*env)->NewStringUTF(env,str);}/*从java接收两个int型参数,相加然后将结果返回给java,C和java的int类型数据的字节数都是四个字节*/JNIEXPORT jint JNICALL Java_com_example_zhongtao_jniday13_Hello_helloIntC (JNIEnv *env, jclass jobj, jint x, jint y){ LOGD("x+y==%d",(x+y)); return x+y; } /** 从java接收一个字符串,这里要注意java的字符串和C的处理不一样,这里需要将java的字符串转成指针才可以用*/JNIEXPORT jstring JNICALL Java_com_example_zhongtao_jniday13_Hello_helloString(JNIEnv *env, jclass jobj, jstring jstr){ char* string=Jstring2CStr(env,jstr); int len=strlen(string); LOGD("len==%d",len); int i; //遍历数组string,然后给每个结果加一 for(i=0;i<len;i++){ *(string+i) +=1; } return (*env)->NewStringUTF(env,string);}/*传递一个int型数组,返回一个int型数组*/JNIEXPORT jintArray JNICALL Java_com_example_zhongtao_jniday13_Hello_arrElement(JNIEnv *env, jclass jobj, jintArray jarry){ //获取数组长度 int len=(*env)->GetArrayLength(env,jarry); LOGD("array len==%d",len); jintArray jin_arr=(*env)->NewIntArray(env,len); //定义一个jintArray数组 //获取数组首地址 //java中的boolean,用来表示GetIntArrayElements()执行完后是否创建副本,没有创建返回NULL,创建了返回True,一般不用这个参数直接传一个NULL// jboolean isCopy=NULL; jint* p=(*env)->GetIntArrayElements(env,jarry,NULL); int i; for(i=0;i<len;i++){ *(p+i) +=10; LOGD("*p==%d",(*(p+i))); } //将p的值赋给新数组jin_arr (*env)->ReleaseIntArrayElements(env,jin_arr,p,0); //获取到了数组的首地址,通过指针操作每个元素之后,jarry里的每一个元素已经被修改,所以可以直接返回jarry; return jin_arr; }另附NDK检测堆栈异常信息的命令adb logcat | ndk-stack -sym ./obj/local/armabi-v7a 获取崩溃JNI堆栈信息在手机上运行时,jni报错导致程序崩溃时可以用上述定位问题。
阅读全文
0 0
- JNI中几种基本数据的处理方式
- NDK开发 - JNI基本数据和字符串处理
- android jni基本使用方式
- Jni开发时,dll文件放置的路径处理方式
- Jni开发时,dll文件放置的路径处理方式
- Jni开发时,dll文件放置的路径处理方式
- Jni开发时,dll文件放置的路径处理方式
- Java处理Web应用的基本方式
- jni数据和对象处理
- JNI的基本使用方法
- JNI的基本介绍
- JNI的基本语法
- JNI的基本语法
- JNI的基本语法
- JNI的基本语法
- smarty中基本数据的获取方式
- 并发处理数据最基本的方法
- JNI异常的处理
- BZOJ4866: [Ynoi2017]由乃的商场之旅 莫队
- Jquery通过ajax实现三级联动
- ACL配置
- canvas.save() 和 canvas.restore() 的作用
- 文件目录结构显示与文件搜索
- JNI中几种基本数据的处理方式
- spring security 注解@EnableGlobalMethodSecurity的三种开启注解方式
- 简历的艺术
- Java上位机
- seq2seq
- 数据库范式
- word格式替换,替换隐藏文本
- ldconfig gcc -soname
- windows 2008 r2域下Ftp用户隔离