JNI方法
步驟:
1.獲取jclass
2.獲取方法ID;jmethodID
3.jni調(diào)用java的方法
extern "C"
JNIEXPORT jstring JNICALL
Java_com_ybj_jnin_MainActivity_getMethod(JNIEnv *env, jobject instance) {
// TODO
//jobject obj
jclass _jclas = env->GetObjectClass(instance);
//(jclass clazz, const char* name, const char* sig)
jmethodID _jmethodID = env->GetMethodID(_jclas,"getName","()Ljava/lang/String;");
//jni 調(diào)用java的方法
//(jobject obj, jmethodID methodID, ...)
jstring str = (jstring) env->CallObjectMethod(instance, _jmethodID);
char * string = (char *) env->GetStringUTFChars(str, NULL);
char text[20] = "success";
//(char* _Nonnull __restrict, const char* _Nonnull __restrict)
char * finalResult = strcat(string,text);
return env->NewStringUTF(finalResult);
}
數(shù)組
步驟:
1.獲取數(shù)組元素
2.獲取數(shù)組長度
3.釋放元素
//首先將a強(qiáng)制聲明為指向整數(shù)的指針,讀取指針對應(yīng)的整數(shù)
int compare(const void* a, const void* b){
return (*(int*)a - *(int*)b);
}
extern "C"
JNIEXPORT void JNICALL
Java_com_ybj_jnin_MainActivity_getArray(JNIEnv *env, jobject instance, jintArray arrays_) {
jint *arrays = env->GetIntArrayElements(arrays_, NULL);
//獲取數(shù)組長度
//(jarray array)
int _len = env->GetArrayLength(arrays_);
//(void*, size_t, size_t, int (*)(const void*, const void*))第三個參數(shù)需要強(qiáng)轉(zhuǎn)
qsort(arrays,_len, sizeof(int),compare);
// TODO
env->ReleaseIntArrayElements(arrays_, arrays, 0);
}
引用(解決JVM回收J(rèn)NI對象)
- 局部引用
通過NewLocalRef和各種JNI接口創(chuàng)建(FindClass、NewObject、GetObjectClass和NewCharArray等)。
會阻止GC回收所引用的對象。函數(shù)返回后局部引用所引用的對想會被JVM自動自動釋放,或調(diào)用DeleteLocalRef釋放。
-全局引用
調(diào)用NewGlobalRef基于局部引用創(chuàng)建。會阻止GC回收所引用的對象??梢钥绶椒?,跨線程使用。JVM不會自動釋放。必須手動調(diào)用DeleteGlobalRef手動釋放
-弱全局引用
與全局引用不一樣的是,弱全局引用:
節(jié)省內(nèi)存,在內(nèi)存不足時可以是釋放所引用的對象。
可以引用一個不常用的對象,如果為NULL的時候(被回收了),可以手動再臨時創(chuàng)建一個。
extern "C"
JNIEXPORT void JNICALL
Java_com_ybj_jnin_MainActivity_getLocalReference(JNIEnv *env, jobject instance) {
//模擬一個循環(huán)
for (int i = 0; i < 100; ++i) {
//(const char* name)
jclass _jclass = env->FindClass("java/util/Date");
jobject _jobj = env->NewObject(_jclass,env->GetMethodID(_jclass,"<init>","()v"));
//對象的操作
env->DeleteLocalRef(_jobj);
}
// TODO
}
JNI調(diào)用構(gòu)造函數(shù)
傳入“<init>”作為方法名,“V”作為返回類型。