1. 數(shù)組的細(xì)節(jié)處理
c中的排序方法:
void qsort(void * _Base, size_t _NumOfElements, size_t _SizeOfElements, int(* _PtFuncCompare)(const void *, const void ))
對(duì)jarray 排序()第一個(gè)參數(shù) void 數(shù)組首地址他去,
第二個(gè)參數(shù): 數(shù)組的大小長(zhǎng)度
第三個(gè)參數(shù):數(shù)據(jù)元素類(lèi)型的大小
第四個(gè)參數(shù): 數(shù)組的一個(gè)比較方法指針( Comparable)
c中排序完后要同步到j(luò)array 中并且釋放 inArray:
同步數(shù)組的數(shù)據(jù)給java 數(shù)組饱岸,intArray 并不是jarray 可以理解為copy 了一份
0 :既要同步數(shù)據(jù)給jarray ,又要釋放 inArray
JNI_COMMIT:同步蘇劇給jarray,也會(huì)釋放inArray
JNI_ABORT: 不同步數(shù)據(jù)給jarray,但是會(huì)釋放inArray
(*env)->ReleaseIntArrayElements(env, jarray, inArray,0);
int comparable(const jint *number1,const jint *number2 ){
return *number1 - *number2;
}
JNIEXPORT void JNICALL Java_com_Amn_ndk_03_Simple_sort
(JNIEnv *env, jclass jclz, jintArray jarray){
//獲取傳過(guò)來(lái)的數(shù)組首地址
jint * inArray = (*env)->GetIntArrayElements(env, jarray, NULL);
//獲取傳過(guò)來(lái)的數(shù)組長(zhǎng)度
int length=(*env)->GetArrayLength(env,jarray);
//對(duì)jarray 排序()第一個(gè)參數(shù) void* 數(shù)組首地址,
//第二個(gè)參數(shù) 數(shù)組的大小長(zhǎng)度
//第三個(gè)參數(shù):數(shù)據(jù)元素類(lèi)型的大小
//第四個(gè)參數(shù): 數(shù)組的一個(gè)比較方法指針( Comparable)
qsort(inArray, length, sizeof(int), comparable);
//同步數(shù)組的數(shù)據(jù)給java 數(shù)組慨绳,intArray 并不是jarray 可以理解為copy 了一份
//0 :既要同步數(shù)據(jù)給jarray ,又要釋放 inArray
//JNI_COMMIT:同步蘇劇給jarray,也會(huì)釋放inArray
//JNI_ABORT: 不同步數(shù)據(jù)給jarray,但是會(huì)釋放inArray
(*env)->ReleaseIntArrayElements(env, jarray, inArray,0);
}
2. 局部引用和全局引用
- 1.全局引用
保存全局變量
jstring globalStr;
JNIEXPORT void JNICALL Java_com_Amn_ndk_03_Simple_saveGlobalRef
(JNIEnv *env, jclass jclz,jstring str){
//保存全局變量爱榔,方便以后其他方法用到
globalStr = (*env)->NewGlobalRef(env,str);
}
不用的時(shí)候刪除全局變量
(*env)->DeleteGlobalRef(env, globalStr);
JNIEXPORT void JNICALL Java_com_Amn_ndk_03_Simple_deleteGlobalRef
(JNIEnv *env, jclass jclz){
(*env)->DeleteGlobalRef(env, globalStr);
}
- 2.局部引用
構(gòu)建的jobject對(duì)象若不再使用了 自己要回收,回收之后不能在使用(靜態(tài)不需要回收)
(*env)->DeleteLocalRef(env,point);
JNIEXPORT jobject JNICALL java_com_amn_JniSimple_createPoint
(JNIEnv *env, jclass jclz){
//獲取Point 的class FindClass(env,"全類(lèi)名") 注: 全類(lèi)名要反斜杠
jclass point_clazz = (*env)->FindClass(env, "com/amn/Point");
//構(gòu)建函數(shù)id jmethodID j_md = (*env)->GetMethodID(env,point_clazz,"方法名","簽名");
jmethodID j_md = (*env)->GetMethodID(env, point_clazz, "<init>", "(II)V");
//構(gòu)建java層的Point 對(duì)象 (*env)->NewObject(env, "構(gòu)建對(duì)象的class","構(gòu)造函數(shù)的id",函數(shù)參數(shù))
jobject point = (*env)->NewObject(env, point_clazz, j_md, 10, 20);
//構(gòu)建的jobject對(duì)象若不再使用了 自己要回收,回收之后不能在使用(靜態(tài)不需要回收)
(*env)->DeleteLocalRef(env,point);
}
3.緩存策略
*局部靜態(tài)緩存 :緩存策略 static
如:native層有一大堆方法要去獲取 name 屬性
JNIEXPORT void JNICALL Java_com_Amn_ndk_03_Simple_staticLocalCache
(JNIEnv *env, jclass jclz,jstring name){
static jfieldID f_id = NULL;//局部緩存被环,如果這個(gè)方法多次被調(diào)用,不許要反復(fù)去獲取
//獲取f_id
if (f_id ==NULL){
f_id = (*env)->GetStaticFieldID(env, jclz, "name", " Ljava / lang / String;");
}
//name賦值操作
(*env)->SetStaticObjectField(env,jclz,f_id,name);
}
- 全局靜態(tài)緩存 详幽,在java構(gòu)造函數(shù)中初始化的時(shí)候去調(diào)用緩存方法
//全局靜態(tài)緩存 筛欢,在構(gòu)造函數(shù)中初始化的時(shí)候去緩存
static jfieldID f_name_id1= NULL;
static jfieldID f_name_id2 = NULL;
static jfieldID f_name_id3 = NULL;
JNIEXPORT void JNICALL Java_com_Amn_ndk_03_Simple_staticLocalCache
(JNIEnv *env, jclass jclz,jstring name){
//如果這個(gè)方法會(huì)反復(fù)的調(diào)用,那么不會(huì)反復(fù)的獲取jfieldID
(*env)->SetStaticObjectField(env, jclz, f_name_id1, name);
}
JNIEXPORT void JNICALL Java_com_Amn_ndk_03_Simple_initLocalCache
(JNIEnv *env, jclass jclz){
//初始化全局靜態(tài)緩存
f_name_id1 = (*env)->GetStaticFieldID(env, jclz, "name", " Ljava / lang / String;");
f_name_id2 = (*env)->GetStaticFieldID(env, jclz, "name", " Ljava / lang / String;");
f_name_id3 = (*env)->GetStaticFieldID(env, jclz, "name", " Ljava / lang / String;");
}