在jni开发中,由于是java将数据传给C,有几点需要注意。除了C的函数名需要特定的命名外,还有的就是数据之间的转化。
数据间的传化是一个很深的学问,下面小沃就来讲讲一个用的比较多的几个逻辑。
一、java的string类型转为C的char*类型
java的String类型会转化为C的jstring,这里我们就需要重点将jstring转化为char*了。
转化方法如下:
jboolean isCp; const char *c_pstrCom = (*env) -> GetStringUTFChars(env, pstrCom, &isCp);//这里开辟 //在这里使用 ...... (*env) -> ReleaseStringUTFChars(env, pstrCom, c_pstrCom);//这里销毁
二、java是引用类型,通过C的指针返回数据
(1)、这里我们先以简单的int类型为例
java的int[]类型会转化为C的jintArray,下方的代码中,num是jintArray类型的。
实现方式如下:
jint *c_num = (*env) -> GetIntArrayElements(env, num, &isCp);//获取对应元素 (*c_num) = 8888//必须这里赋值 (*env) -> ReleaseIntArrayElements(env, nHandle, c_num, 0);//销毁对应元素
(2)、这种实现方式中,最难实现的,其实是C语言中char*类型的返回
java的char[]类型会转化为C的jcharArray,下方的代码中,buf是jcharArray类型的。
实现方法如下:
char str[]="hello world\n"; jboolean isCp; jchar *c_buf = (*env) -> GetCharArrayElements(env, buf, &isCp); int slen = strlen(str); int length = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, NULL, 0); MultiByteToWideChar( CP_ACP, 0, (LPCSTR) str, slen, (LPWSTR) c_buf, length); (*env) -> ReleaseCharArrayElements(env, buf, c_buf, 0);
后续小沃依旧会继续分享小沃在研发过程中的各种经验,请多专注小沃的微信公共号(武汉网站app智能硬件开发)或是微博号(沃航科技)。