对理解JNI有较大帮助,里面有很多之前不懂的细节
[
1 JNI/NDK开发指南(二)——JVM查找java native方法的规则
]
在Linux/Unix系统中,这两个宏可以省略不加:JNIEXPORT JNICALL
![](https://img-blog.csdnimg.cn/7911d881e45f431e9908e311831b56fd.png)
![](https://img-blog.csdnimg.cn/3457be2fac404e5c9ee6bacf2bcf5a06.png)
[
2 JNI/NDK开发指南(三)——JNI数据类型及与Java数据类型的映射关系
]
![](https://img-blog.csdnimg.cn/46d95edcfc1d44caa3b43869ba16bc87.png)
![](https://img-blog.csdnimg.cn/12f5668130d5417c94b41d5060f84485.png)
![](https://img-blog.csdnimg.cn/ea96758e21494acab0cc219f3bfc938a.png)
![](https://img-blog.csdnimg.cn/72cc1d737c2049eb9337dbbdbc6137b4.png)
[
3 JNI/NDK开发指南(四)——字符串处理
]
jboolean unsigned 8 bits
jbyte signed 8 bits
jchar unsigned 16 bits
jshort signed 16 bits
jint signed 32 bits
![](https://img-blog.csdnimg.cn/ea9e9507d2524e62a99c14d48c0309ce.png)
![](https://img-blog.csdnimg.cn/8f5121874f73476eada81b47ad115626.png)
isCopy一直以来,都用错了!!!
![](https://img-blog.csdnimg.cn/23e6d2d15ce14816a568c6e51745597e.png)
1> 访问字符串
![](https://img-blog.csdnimg.cn/97d3078a69fd4e56bd84800d76ca718a.png)
2> 异常检查
![](https://img-blog.csdnimg.cn/b8e5771daf6845359899ea97e69b50c0.png)
3> 释放字符串
![](https://img-blog.csdnimg.cn/d6212ce69d4e46b3ac2174c6313a314d.png)
![](https://img-blog.csdnimg.cn/331f4c8ac40643ff8043bbcba2a525a1.png)
4> GetStringCritical和ReleaseStringCritical:
提高
JVM返回源字符串直接指针
的可能性
![](https://img-blog.csdnimg.cn/7242c3aee620496ca9c15c0321763fca.png)
5> GetStringRegion和GetStringUTFRegion
分别表示获取Unicode和UTF-8编码字符串指定范围内的内容。
这对函数会把源字符串复制到一个预先分配的缓冲区内。
![](https://img-blog.csdnimg.cn/f8e7d7eabd4340b8903f4e394698eca8.png)
![](https://img-blog.csdnimg.cn/6de6590e9f8c40b1b7c05890bbe2e65d.png)
[
字符串操作总结
]:
![](https://img-blog.csdnimg.cn/c35d0b2effc248679f67d59328b33066.png)
其中:
2:本地代码不应在 JVM 内部分配新对象:为什么不能分配新对象???????
[
5 JNI/NDK开发指南(五)——访问数组(基本类型数组与对象数组)
]
一、访问基本类型数组
![](https://img-blog.csdnimg.cn/0e70904f9d5e4a3ca7067551d3e4b4b7.png)
![](https://img-blog.csdnimg.cn/5b38962011b14139b3d9018697a0e070.png)
![](https://img-blog.csdnimg.cn/be714ce24f8440c2b6c71432ed67a48d.png)
![](https://img-blog.csdnimg.cn/393506b451a842808cd778935146e5a2.png)
![](https://img-blog.csdnimg.cn/68c12fdc5a4b4edfb92014af0684d802.png)
二、访问对象数组
![](https://img-blog.csdnimg.cn/f9b6b7f3d3f24572bd5f32b383c341fb.png)
一维数组中套一维数组,就形成了一个所谓的二维数组。
![](https://img-blog.csdnimg.cn/eada84475fe94b218204ed43781f04fd.png)
[
6 JNI/NDK开发指南(六)——C/C++访问Java实例方法和静态方法
]
一、callJavaStaticMethod静态方法实现说明
![](https://img-blog.csdnimg.cn/4f21bb6ec9234b8b90a46820d529a963.png)
Android NDK环境与PC环境:
JVM与Android Dalvik虚拟机
问题:PC环境是指不用手机实际测试么???
二、callInstanceMethod实例方法实现说明
![](https://img-blog.csdnimg.cn/2348d2ab882b47b6b2b5d29012e8a5c3.png)
[
7 JNI/NDK开发指南(七)——C/C++访问Java实例变量和静态变量
]
![](https://img-blog.csdnimg.cn/6c4cae1431794110b53dd20813043a6e.png)
[
8 JNI/NDK开发指南(八)——调用构造方法和父类实例方法
]
这章详细来介绍下初始一个对象的两种方式,以及如何调用子类对象重写的父类实例方法。
![](https://img-blog.csdnimg.cn/5db7dc304e38465982ecf41d8f5b6373.png)
下面通过一个示例来了解在JNI中是如何调用对象构造方法和父类实例方法的。
![](https://img-blog.csdnimg.cn/89af2c7eef174f06977841c34166cee2.png)
[9
JNI/NDK开发指南(九)——JNI调用性能测试及优化
]
![](https://img-blog.csdnimg.cn/e154f54247bc42219cd848109c9abdcc.png)
1 使用时缓存
例子1
![](https://img-blog.csdnimg.cn/70e69d82b13a47e88bbc77ffc257ed52.png)
例子2
![](https://img-blog.csdnimg.cn/3b0f96087aa043a280f22cd1b752c8a6.png)
![](https://img-blog.csdnimg.cn/44da2abeb1334985acdb5269763be9a6.png)
注意:也就是说局部静态变量:
static jfieldID fid_str;
static jclass cls_string;
static jmethodID cid_string;
只有jclass属于局部引用,会被VM自动释放!!!
见[
JNI/NDK开发指南(三)——JNI数据类型及与Java数据类型的映射关系
],引用类型指的是jobject及其子类,包括:jstring jclass jthrowable jarray等.
![](https://img-blog.csdnimg.cn/01206e3af16a4c578efc8551b7199c3e.png)
2 类静态初始化缓存
![](https://img-blog.csdnimg.cn/504a529fc41048d79168b000ce0c1ac7.png)
[10 Android JNI局部引用表溢出:local reference table overflow (max=512)]
![](https://img-blog.csdnimg.cn/9c624b994803483e99c0a016d6d08143.png)
![](https://img-blog.csdnimg.cn/d8d63d8b088c40beafbfce69645ee47c.png)
[11 JNI/NDK开发指南(十)——JNI局部引用、全局引用和弱全局引用]
这篇文章比较偏理论,详细介绍了在编写本地代码时三种引用的使用场景和注意事项。
![](https://img-blog.csdnimg.cn/9253abb4093c4e20975518d6c3b292b1.png)
![](https://img-blog.csdnimg.cn/21980874e1ab482ebb3a6fbb8c3bedfa.png)
![](https://img-blog.csdnimg.cn/e9d5f7f47b0445a79133fd39af5339df.png)
三种引用简介及区别:
![](https://img-blog.csdnimg.cn/f98ed0d23cba4d0ab66d5c7772919e63.png)
![](https://img-blog.csdnimg.cn/4e1f5562241c48839e478154481576e1.png)
![](https://img-blog.csdnimg.cn/fdbf3eb49089458b9d93b732eb7ddcc5.png)
[
局部引用
]
![](https://img-blog.csdnimg.cn/b9df5aabfdcd4c868cce94f7ff816c9f.png)
再次调用newString接口,cls_string变为野指针!!!
![](https://img-blog.csdnimg.cn/4ec2171f7a544adca8a67ad5c9a2c255.png)
[全局
引用
]
![](https://img-blog.csdnimg.cn/66fcb6cf4a1144dfbbd8554c4e911054.png)
全局引用可以用static jclass来缓存
![](https://img-blog.csdnimg.cn/afc5a563649d4419bd6dd80da79ba694.png)
[弱全局
引用
]
[12
JNI/NDK开发指南(十一)——JNI异常处理
]
![](https://img-blog.csdnimg.cn/d9d18f4415454237bc47eed1f5f67561.png)
![](https://img-blog.csdnimg.cn/9554fdd5f3074e0c98da31003d3f82c0.png)