JNI_weakGlobalReference.c 1.6 KB

1234567891011121314151617181920212223242526272829
  1. #include <stdint.h>
  2. #include "space_anyi_jni_reference_WeakGlobalReferenceTest.h"
  3. JNIEXPORT jlong JNICALL Java_space_anyi_jni_reference_WeakGlobalReferenceTest_getPersonHandler(JNIEnv *env, jobject this){
  4. //1.获取对应的jclass
  5. jclass class_Person = (*env)->FindClass(env, "Lspace/anyi/jni/reference/Person;");
  6. //2.获取对应的构造方法
  7. jmethodID constructor = (*env)->GetMethodID(env, class_Person, "<init>", "(Ljava/lang/String;I)V");
  8. //3.创建对象
  9. jstring name = (*env)->NewStringUTF(env, "杨逸-弱引用");
  10. jobject person = (*env)->NewObject(env, class_Person, constructor,name,18);
  11. //4.获取全局弱引用
  12. jobject weakGlobalReference = (*env)->NewWeakGlobalRef(env, person);
  13. //5.转换为句柄,使用intptr_t类型作为中间类型,避免精度丢失
  14. jlong handler = (jlong)(intptr_t)weakGlobalReference;
  15. return handler;
  16. }
  17. JNIEXPORT jobject JNICALL Java_space_anyi_jni_reference_WeakGlobalReferenceTest_getPerson(JNIEnv *env, jobject this, jlong handler){
  18. //1.通过句柄获取全局弱引用,使用intptr_t类型作为中间类型
  19. jobject person = (jobject)(intptr_t)handler;
  20. return person;
  21. }
  22. JNIEXPORT void JNICALL Java_space_anyi_jni_reference_WeakGlobalReferenceTest_freePerson(JNIEnv *env, jobject this, jlong handler){
  23. //1.通过句柄获取全局弱引用,使用intptr_t类型作为中间类型
  24. jobject weakGlobalReference = (jobject)(intptr_t)handler;
  25. //2.释放全局弱引用
  26. (*env)->DeleteWeakGlobalRef(env, weakGlobalReference);
  27. }