代码请看:10.JNI基础-缓存策略和异常处理
1. 数组排序:
void qsort(void * _Base, size_t _NumOfElements, size_t _SizeOfElements, int(*_PtFuncCompare)(const void *, const void *))
:c中的排序方法jxxx* = env->GetXXArrayElements(env,jarray,NULL);
:将java层的数组转换成c层的数组(指针)。(*env)->ReleaseXXArrayElements(env, jarray, xxArray, JNI_OK);
:同步数组的数据给 java 数组 xxArray 并不是 jarray。1
2
3// JNI_OK == 0::既要同步数据给 jarray, 又要释放 intArray
// JNI_COMMIT == 1:会同步数据给 jarray, 但是不会释放 intArray
// JNI_ABORT == 2:不会同步数据给 jarray, 但是会释放 intArray
native层:
1 | // 4. 定义一个 compare 的方法 |
2. 局部引用和全局引用
jobject j_str = (*env)->NewObject(env,str_clz,jmid)
:局部引用对象生成。(*env)->DeleteLocalRef(env,j_str);
:删除局部引用jstring globalStr =(*env)->NewGlobalRef(env,value);
:创建全局引用- (*env)->DeleteGlobalRef(env,globalStr):删除全局引用
2.1. 局部引用
1 | // 局部引用 |
2.2 全局引用
1 |
|
3. 缓存策略 static, native层有一大堆方法需要去获取 name 属性 // 初始化全局静态缓存
3.1 局部静态缓存
局部静态缓存:即使方法被重复调用也不会反复的给static
修饰的字段赋值。
1 | JNIEXPORT void JNICALL Java_com_east_jni10_Sample_staticLocalCache |
3.2 全局静态缓存
全局静态缓存:即使方法被重复调用也不会反复的给static
修饰的字段赋值。
1 | // 全局静态缓存 |
4. 异常处理(简单讲,C++异常)
jthrowable throwable = (*env)->ExceptionOccurred(env);
:正在抛出一个异常的本地引用(*env)->ExceptionClear(env);
:清除异常(*env)->Throw(env, throwable);
:将ExceptionOccurred获取到的异常直接抛给java层(*env)->ThrowNew(env, no_such_clz, "NoSuchFieldException name3");
:抛出自己想抛出的异常
异常说明:
ExceptionCheck
用于检测如果一个异常已经抛出,则该方法将会返回JNI_TRUE就是typedef定义为1的布尔值。ExceptionOccurred
获取正在抛出一个异常的本地引用,Native或Java层必须处理该异常,并返回一个jthrowable对象。ExceptionDescribe
主要用于打印出异常的错误描述。ExceptionClear
清除刚刚抛出的异常。FatalError
的作用比较特殊,产生一个致命性的错误,Android123提示这样会导致JVM将关闭,就是程序停止运行了,所以使用时要谨慎。
说明下:ExceptionCheck
用法
1 | env->FindClass("Android123CWJ"); //假设这个类本身不存在 |
下面是:ExceptionOccurred
用法
注意: 保存后在抛出异常后记得 return
1 | // 异常处理 |