@@ -41,6 +41,13 @@ bool restore_image(JNIEnv *env, jobject bitmap_obj, unsigned int width, unsigned
4141 if (env == nullptr || bitmap_obj == nullptr || copy_file_path == nullptr ) {
4242 return false ;
4343 }
44+ jboolean object_recycled = env->IsSameObject (bitmap_obj, nullptr );
45+
46+ if (object_recycled == JNI_TRUE) {
47+ // not reachable
48+ return false ;
49+ }
50+
4451 void *pixels;
4552 if (AndroidBitmap_lockPixels (env, bitmap_obj, &pixels) == 0 ) {
4653 LOGI (" restore_image, width: %d, height: %d, %s" , width, height, copy_file_path);
@@ -392,12 +399,12 @@ jint do_hook_bitmap(long bitmap_recycle_check_interval,
392399}
393400
394401extern " C"
395- jobject do_dump_info (JNIEnv *env, bool justCount) {
396- jclass bitmap_record_class = env->FindClass (
397- " top/shixinzhang/bitmapmonitor/BitmapRecord" );
402+ jobject do_dump_info (JNIEnv *env, bool justCount, bool ensureRestoreImage) {
398403
399- jmethodID bitmap_record_constructor_method = env->GetMethodID (bitmap_record_class, " <init>" ,
400- " (JIIIIJLjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" );
404+
405+ if (g_ctx.java_vm != nullptr ) {
406+ g_ctx.java_vm ->AttachCurrentThread (&env, nullptr );
407+ }
401408
402409 if (!g_ctx.record_mutex .try_lock ()) {
403410 return nullptr ;
@@ -408,7 +415,7 @@ jobject do_dump_info(JNIEnv *env, bool justCount) {
408415 long long remain_bitmap_size = 0 ;
409416 int index = 0 ;
410417 jobjectArray java_bitmap_record_array = env->NewObjectArray (remain_bitmap_count,
411- bitmap_record_class, nullptr );
418+ g_ctx. bitmap_record_class , nullptr );
412419
413420 for (auto record : bitmap_records) {
414421 remain_bitmap_size += record.height * record.stride ;
@@ -420,11 +427,7 @@ jobject do_dump_info(JNIEnv *env, bool justCount) {
420427 jstring current_scene = record.current_scene ;
421428 bool restore_succeed = record.restore_succeed ;
422429
423- if (g_ctx.java_vm != nullptr ) {
424- g_ctx.java_vm ->AttachCurrentThread (&env, nullptr );
425- }
426-
427- if (save_path != nullptr && !restore_succeed) {
430+ if (ensureRestoreImage && save_path != nullptr && !restore_succeed) {
428431 // Need get pixels and restore again
429432 char *path = const_cast <char *>(env->GetStringUTFChars (save_path, 0 ));
430433 unsigned int bit_per_pixel = record.stride / record.width ;
@@ -436,8 +439,8 @@ jobject do_dump_info(JNIEnv *env, bool justCount) {
436439
437440 // 每一条记录
438441 jobject java_record = env->NewObject (
439- bitmap_record_class,
440- bitmap_record_constructor_method,
442+ g_ctx. bitmap_record_class ,
443+ g_ctx. bitmap_record_constructor_method ,
441444 (jlong) record.native_ptr ,
442445 (jint) record.width ,
443446 (jint) record.height ,
@@ -520,6 +523,16 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) {
520523 jclass bitmap_jclass = env->FindClass (" android/graphics/Bitmap" );
521524 g_ctx.native_ptr_field = env->GetFieldID (bitmap_jclass, " mNativePtr" , " J" );
522525
526+ jclass bitmap_record_clz = env->FindClass (
527+ " top/shixinzhang/bitmapmonitor/BitmapRecord" );
528+ g_ctx.bitmap_record_class = (jclass)env->NewGlobalRef (bitmap_record_clz);
529+
530+ if (g_ctx.bitmap_record_class != nullptr ) {
531+ g_ctx.bitmap_record_constructor_method = env->GetMethodID (g_ctx.bitmap_record_class ,
532+ " <init>" ,
533+ " (JIIIIJLjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" );
534+ }
535+
523536 g_ctx.dump_stack_method = dump_stack_method_id;
524537 g_ctx.get_current_scene_method = get_current_scene_method_id;
525538 g_ctx.inited = true ;
@@ -554,11 +567,11 @@ Java_top_shixinzhang_bitmapmonitor_BitmapMonitor_dumpBitmapCountNative(JNIEnv *e
554567 if (!g_ctx.open_hook ) {
555568 return nullptr ;
556569 }
557- return do_dump_info (env, true );
570+ return do_dump_info (env, true , false );
558571}
559572
560573extern " C"
561574JNIEXPORT jobject JNICALL
562- Java_top_shixinzhang_bitmapmonitor_BitmapMonitor_dumpBitmapInfoNative (JNIEnv *env, jclass clazz) {
563- return do_dump_info (env, false );
575+ Java_top_shixinzhang_bitmapmonitor_BitmapMonitor_dumpBitmapInfoNative (JNIEnv *env, jclass clazz, jboolean ensureRestoreImage ) {
576+ return do_dump_info (env, false , ensureRestoreImage );
564577}
0 commit comments