/********************************************************************************************
* author:conowen@大钟
* E-mail:conowen@hotmail.com
* http://blog.csdn.net/conowen
* 注:本文为原创,仅作为学习交流使用,转载请标明作者及出处。
********************************************************************************************/
在Java中有两类数据类型:primitive types,如,int, float, char;另一种为reference types,如,类,实例,数组。
注意:数组,不管是对象数组还是基本类型数组,都作为reference types存在,有专门的JNI方法取数组中每个元素。
1、void
java的void与JNI的void是一致的。
2、基本数据类型
3、对象类型
相比基本类型,对象类型的传递要复杂得多。不能对Jstring进行直接操作。
注意:
3.1、GetStringUTFChars与ReleaseStringUTFChars函数简单说明(跳到3.2有更方便的函数)
JNI支持Unicode/UTF-8字符编码互转。Unicode以16-bits值编码;UTF-8是一种以字节为单位变长格式的字符编码,并与7-bitsASCII码兼容。UTF-8字串与C字串一样,以NULL('\0')做结束符, 当UTF-8包含非ASCII码字符时,以'\0'做结束符的规则不变。7-bit ASCII字符的取值范围在1-127之间,这些字符的值域与UTF-8中相同。当最高位被设置时,表示多字节编码。
//或者return (*env)->NewStringUTF(env, "hello world");
}
上述函数中,有isCopy参数,当该值为JNI_TRUE,将返回str的一个拷贝;为JNI_FALSE将直接指向str的内容。 注意:当isCopy为JNI_FALSE,不要修改返回值,不然将改变java.lang.String的不可变语义。一般会把isCopy设为NULL,不关心Java VM对返回的指针是否直接指向java.lang.String的内容。
注意:在调用GetStringChars之后,一定要调用ReleaseStringChars做释放,(Unicode -> UTF-8转换的原因)。不管在调用GetStringChars时为isCopy赋值JNI_TRUE还是JNI_FALSE,因不同JavaVM实现的原因,ReleaseStringChars可能释放内存,也可能释放一个内存占用标记。
3.2、GetStringRegion/GetStringUTFRegion函数简单说明
因为这两个函数不涉及内存操作,所以较GetStringUTFChars使用要简单。也不用进行释放指针之类的操作,非常方便。(推荐使用)
GetStringUTFRegion有两个主要的参数,start 和 length, 这两个参数以Unicode编码计算. 该函数会做边界检查,所以可能抛出StringIndexOutOfBoundsException。
3.3、GetStringLength/GetStringUTFLength函数简单说明
前者是Unicode编码长度,后者返回的是是UTF编码长度。
4、数组类型
JNI对每种数据类型的数组都有对应的函数。
4.1、常见错误操作:
4.2、使用void Get<Type>ArrayRegion(JNIEnv *env,<ArrayType> array, jsize start,jsize len, <NativeType> *buf);进行操作
参数说明:
env: the JNIEnv interface pointer.
array: a reference to an array whose elements are to be copied.将要被拷贝的目标数组<ArrayType>
start: the starting index of the array elements to be copied.(数组的起始位置)
len: the number of elements to be copied.(拷贝元素的个数)
buf: the destination buffer.存放结果的本地数组<NativeType>
返回值:void
JNI中数组的基类为jarray,其他如jintArray都是继承自jarray。
4.3、使用<NativeType> *Get<Type>ArrayElements(JNIEnv *env,<ArrayType> array, jboolean *isCopy);进行数组操作
参数说明:
env: the JNIEnv interface pointer.array: a reference to the primitive array whose elements are tobe accessed.(目标数组)
isCopy: a pointer to a jboolean indicating whether a function
返回值:返回指向Java数组的一个直接的指针
使用实例:
)
更多数组操作函数:
5、另外一些有用的宏定义(来自jni.h)
分享到:
相关推荐
Android NDK JNI 经典实例Android NDK JNI 经典实例Android NDK JNI 经典实例Android NDK JNI 经典实例Android NDK JNI 经典实例Android NDK JNI 经典实例Android NDK JNI 经典实例
详情请参考我的技术博客:http://blog.csdn.net/allen315410/article/details/41826511
Android NDK 开发时需要的 常用的JNI API
不管你是想将已经存在的原生代码应用移植到Android平台上还是准备开始在Android平台上进行软件开发,使用《Android C++高级编程——使用NDK》一书提供的技术可以构建更出色的应用。本书将展示构建性能更好的复杂原生...
Android NDK 开发教程 三 Hello JNI 示例
第2章 深入了解androidndk 35 第3章 用jni实现与原生代码通信 57 第4章 使用swig自动生成jni代码 81 第5章 日志、调试及故障处理 111 第6章 bionic api入门 135 第7章 原生线程 155 第8章 posix socket api:面向...
这是Android NDK开发标准的JNI和Android.mk编写模版,里面的一些东西可能涉及我的项目,但不影响观看
Android-NDK-MD5-安卓jni 进行md5加密; Android-NDK-MD5-安卓jni 进行md5加密
详情请参考我的博客 http://blog.csdn.net/allen315410/article/details/41862479
《Android C++高级编程——使用NDK》提供了Java原生接口(JNI)的概述、Bionic API、POSIX 线程和套接字、C++支持、原生图形和声音API以及NEON/SIMD优化,在一个游戏应用案例的帮助下,你将学到很多关键技能。...
Android NDK 开发教程及JNI教程c语言开发介绍
NDK简单Demo,主要使用的是c语言,gradle-experimental插件。
Android NDK 开发教程 二 概述
jni数据类型转换例程 1. java向native传递常用基本数据类型 和字符串类型 2. java向native传递数组类型 3. java向native传递自定义java对象 4. java向native传递任意java对象(以向native传递ArrayList为例) 5....
详细介绍了在eclipse中android项目下c/c++代码的自动编译,和在eclipse中用ant生成ndk需要的jni头文件,加速ndk的开发,因为是原创,费了不少心力和时间,所以设了6分,有人反映太贵了,现在调成3分,这下大家满意了...
在jni中获取android 设备的mac地址
尽管Android Studio已经越来越流行了,但很多人还是习惯于Eclipse或源码环境下开发JNI应用。个人认为使用Android Studio作NDK开发是必然趋势,所以本文将简单介绍如何在Android Studio上实现NDK开发。 简介 JNI JNI ...
该资源包含了一个用android实现的androidndk文档,简单易懂!
android ndk 开发入门小例子。 博客地址http://blog.csdn.net/u014702653/article/details/51861013
Android jni文件读写 NDK文件读取 读写 操作 NDK数据加密DEMO 源码直接上传,运行在android6.0系统测试通过