JNI_globalReference.c 1.3 KB

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