1.c中的jstring数据类型就是java传入的String对象,经过jni函数的转化就能成为c的char*。
Java
类型
本地c类型
说明
boolean
jboolean
无符号
8 位
byte
jbyte
无符号
8 位
char
jchar
无符号
16 位
short
jshort
有符号
16 位
int
jint
有符号
32 位
long
jlong
有符号
64 位
float
jfloat
有符号
32 位
double
jdouble
有符号
64 位
2.如何将java传入的String参数转换为c的char*,然后使用?
java传入的String参数,在c文件中被jni转换为jstring的数据类型,在c文件中声明char* test,然后
test = (char*)(*env)->GetStringUTFChars(env, jstring, NULL);
注意:test使用完后,通知虚拟机平台相关代码无需再访问:
(*env)->ReleaseStringUTFChars(env, jstring, test);
3.将c中获取的一个char*的buffer传递给java?
这个char*如果是一般的字符串的话,作为string传回去就可以了。如果是含有’/0’的buffer,最好作为bytearray传出,因为可以制定copy的length,如果copy到string,可能到’/0’就截断了。
有两种方式传递得到的数据:
一种是在jni中直接new一个byte数组,然后调用函数
(*env)->SetByteArrayRegion(env, bytearray, 0, len, buffer);
将buffer的值copy到bytearray中,函数直接return bytearray就可以了。
一种是return错误号,数据作为参数传出,但是java的基本数据类型是传值,对象是传递的引用,所以将这个需要传出的byte数组用某个类包一下,如下:
class RetObj{
public byte[] bytearray;
}
这个对象作为函数的参数retobj传出,通过如下函数将retobj中的byte数组赋值便于传出。代码如下:
jclass cls;
jfieldID fid;
jbyteArray bytearray;
bytearray = (*env)->NewByteArray(env,len);
(*env)->SetByteArrayRegion(env, bytearray, 0, len, buffer);
cls = (*env)->GetObjectClass(env, retobj);
fid = (*env)->GetFieldID(env, cls, "retbytes", "[B"]);
(*env)->SetObjectField(env, retobj, fid, bytearray);
4.如何在c中返回String给java
char charStr[50];
jstring jstr;
jstr = env -> NewStringUTF(charStr);
5. 不知道占用多少空间的buffer,如何传递出去呢?
在jni的c文件中new出空间,传递出去。java的数据不初始化,指向传递出去的空间即可。
另:JNI中对JAVA传入数据的处理
如果传入的是bytearray的话,作如下处理得到buffer:
char *tmpdata = (char*)(*env)->GetByteArrayElements(env, bytearray, NULL);
(*env)->ReleaseByteArrayElements(env, bytearray, tmpdata, 0);

转载于:https://www.cnblogs.com/Free-Thinker/p/6155118.html

android jni与java之间数据传输时怎么转换相关推荐

  1. jni和java之间字符串的转换

    jni和java之间字符串的转换方法. C的实现: JNIEXPORT jstring JNICALL Java_Android123_CwjC (JNIEnv *env, jobject obj, ...

  2. android jni 返回java类

    今天,简单讲讲android 在jni中如何返回一个java的类. 之前,我写了一些关于jni的博客,里面返回的都是简单的int类型,那么如果我需要返回很多int和String类型,那么怎么办呢?当然 ...

  3. Android JNI(Java Native Interface)技术介绍

    Android平台上的JNI技术介绍 JUL 15TH, 2013 | COMMENTS NDK简介 Android是由Google领导开发的操作系统,Android依靠其开放性,迅速普及,成为目前最 ...

  4. android jni 调用java对象_Android NDK开发之Jni调用Java对象

    本地代码中使用Java对象 通过使用合适的JNI函数,你可以创建Java对象,get.set 静态(static)和 实例(instance)的域,调用静态(static)和实例(instance)函 ...

  5. Android JNI实现Java与C/C++互相调用,以及so库的生成和调用(JNI方式调用美图秀秀so)

    前言 关于Android Studio如何继承JNI开发环境,请阅读上一篇博文 Android CMake集成JNI开发环境本篇博文将结合实例分别讲解Android中Java如何调用C/C++的方法, ...

  6. 不混淆 android jni,安卓开发,打包时是不是不能加混淆?

    引入了安卓sdk, 打包时是不是不能加混淆? 加入混淆时报错: 06-28 17:42:20.405 26900-26900/? A/art: art/runtime/check_jni.cc:65] ...

  7. Android Jni反射Java方法,弹出对话框

    1.创建页面 /*** @描述 C语言调用java反射方法* @项目名称 App_imooc* @包名 com.android.imooc.jni* @类名 ReflectActivity* @aut ...

  8. Android NDK开发之旅(3): 详解JNI数据类型与C/C++、Java之间的互调

    Android NDK开发之旅(3):详解JNI数据类型与C/C++.Java之间的互调 (码字不易,转载请声明出处:http://blog.csdn.net/andrexpert/article/d ...

  9. jni 传递字符串到java_Android JNI开发-java与c++其间的中文字符串传递

    Android JNI开发---java与c++之间的中文字符串传递 最近在做一个Android电子词典,其中在从词库中读取词条时,用到了jni---java调用c++;在java代码里调用本地方法时 ...

最新文章

  1. MIna框架I/O Service层设计
  2. css 中 border 断线解决,简单实用
  3. 变阻尼汽车悬架振动自适应控制方法分析
  4. 翻译:SQL Server中的索引内部结构:到SQL Server索引级别10的阶梯。
  5. Android之用命令uninstall卸载apk和用 -i 过滤日志忽略大小写
  6. 求职学习笔记|并发编程知识点常见问题总结(一)
  7. C++学习之路 | PTA乙级——1092 最好吃的月饼 (20 分)(精简)
  8. linux系统装好后优化,CentOS 5.6 Linux安装系统后的基本优化
  9. linux内核分析与应用 -- 进程与线程(下)
  10. mysql 分组 列转行_MySQL数据库的分组操作,语句拼接,列转行操作
  11. 深度学习计算机视觉的简介_商业用途计算机视觉简介
  12. 一个非常好的学习方法总结
  13. java京东秒杀_小猿圈Python之实现京东秒杀功能技巧
  14. SVN 查看用户名密码
  15. 函数的参数和函数的值
  16. XGboost-网格调参法
  17. Thinkpad 笔记本散热风扇声音大解决办法
  18. 「GXOI / GZOI 2019」逼死强迫症
  19. 基于Nodejs服务器下,python搭配ffmpeg实现推流直播
  20. 7 款殿堂级的开源 CMS(内容管理系统)

热门文章

  1. cad在布局怎么调比例_大神们都在用的9个CAD制图技巧,你会用几个?
  2. postMessage跨域、跨iframe窗口消息传递
  3. kafka key的作用_kafka系列(kafka端到端原理分析)
  4. Qt文档阅读笔记-Qt跨平台库(Qt基本库)
  5. java excel 兼容问题_java--POI解析excel兼容性问题
  6. 怎么跟女生看电影牵手技巧方法
  7. Ubuntu 20.10安装docker
  8. 荣大速印机维修手册_荣大佳文一体机(速印机)故障及排除方法
  9. python中pi怎么使用_Python中使用Pi的对象传输
  10. java工程如何跑起来的_你编写的Java代码是咋跑起来的?