JNI学习之步步深入三
来源:互联网 发布:模拟2g3g4g网络测试 编辑:程序博客网 时间:2024/04/26 01:17
上一篇中,学习了jni中的类型映射关系。本篇就一个简单点的实例来看看java端的类型,如何被C端识别。同时,在C端实现定义的一个类型
如何传递到java端。本篇以String类型为例,看看java端的unicode编码的String类型如何和C端utf-8编码的char*类型进行交互!
1、首先,在java端写一个Prompt类:其中定义一个getLine方法,他含有一个String类型的参数,同时,返回String类型。
- package demo.jni;
- public class Prompt {
- //传递给一个String对象
- private native String getLine(String str);
- }
2、生成头文件,这里略。。。
3、编写C端:讲解在注释中了
- #include <stdio.h>
- #include <stdlib.h>
- #include "demo_jni_Prompt.h"
- JNIEXPORT jstring JNICALL Java_demo_jni_Prompt_getLine
- (JNIEnv *env, jobject clazz, jstring prompt)
- {
- /**java中String类型的prompt这里,被转换成了jni中的一个类型jstring。
- ***那么这个jstring类型,我们可以直接cout输出吗?答案是否定的。
- ***我们知道在java中字符采用的是Unicode编码,在c/c++中,字符使用UTF-8编码
- ***我们不需要深入了解Unicode和UTF-8两种编码的具体方法和内容。我们只需要知道
- ***Unicode采用的是16-bit编码,而UTF-8采用的是7-bit编码的,所以,我们需要
- ***完成这一转换工作,jni已经提供了相应的接口,如下:
- **/
- char buf[128] = "我是从本地代码获取到的"; //字符缓冲
- jbyte *str;//jbyte类型对应C中的unsigned char
- str = (*env)->GetStringUTFChars(env, prompt, NULL); //这个函数就是将jstring类型的字符串转换为本地字符串,返回jbyte*类型
- if(str == NULL)
- {
- /**
- GetStringUTFChars方法可能会抛出一个OutOfMemoryError的异常,在jni中的异常机制和java中的并不一样
- 在java中抛出异常,如果没有捕获,则程序结束运行;但是,在jni中,即使抛出异常,在本地代码的执行顺序依然不变。
- 所以,这里判断NULL是必须的
- **/
- return NULL;
- }
- printf("%s",str);
- /**
- **使用完了utf-8类型的字符后,我们需要释放由上面方法返回的字符串,这样可以释放被这些字符占用的内存空间,避免造成内存瘫痪
- **/
- (*env)->ReleaseStringUTFChars(env, prompt, str);
- //下面我们看看如何将本地的代码传到java
- return (*env)->NewStringUTF(env, buf); //该方法实例化一个UTF-8编码的本地字符串为java.lang.String类型,新创建的就是java中
- //Unicode类型的代表同一字符串的实例
- //该方法同样可能抛出一个OutOfMemoryError的异常并返回NULL。
- }
可以看到,在生成的本地方法中,原来的String类型的prompt被替换成了jstring。jni提供了GetStringUTFChars方法供我们,将jstring读取到本地。同时提供了NewStringUTF方法,让我们将本地的类型传递到java端。
同理,对于其他的类型,比如数组等,操作也是类似,只是所使用的方法不同而已。
0 0
- JNI学习之步步深入三
- JNI学习之步步深入三
- JNI学习之步步深入三
- JNI学习之步步深入一
- JNI学习之步步深入二
- JNI学习之步步深入一
- JNI学习之步步深入二
- JNI学习之步步深入一
- JNI学习之步步深入二
- NDK---JNI学习步步深入之二
- JNI学习之步步深入一
- JNI学习之步步深入二
- JNI学习之步步深入四--皇后的祝福
- JNI学习之步步深入四--皇后的祝福
- JNI学习之步步深入四--皇后的祝福
- JNI学习之步步深入四--皇后的祝福
- NDK---JNI学习步步深入之一
- JNI步步深入
- python 函数嵌套
- IT管理者的成功蜕变 看致命7宗罪
- sql server同一字段多条记录的合并( sql server 2008以上)
- swift语言初探1
- IT管理人才必备的十大管理能力
- JNI学习之步步深入三
- http://www.howzhi.com/group/iosDevelop/discuss/10134
- linux如何查进程、杀进程
- jqplot插件的简单使用
- C++之多态性与虚函数
- jquery获取和设置radio,check,select选项
- asp网站在windowsserver2008下安装
- 对象存储,文件存储,块存储的概念区分
- c 左值右值