Для чего clazz используется в «частном статическом классе clazz = SnappyDecompressor.class » исходный файл?

#java #hadoop #java-native-interface #native

#java #hadoop #java-native-интерфейс #родной

Вопрос:

Я изучаю реализацию компрессора (на Java) для Snappy, Zlib и других. В верхней части исходного файла находится эта строка ниже. Кто-нибудь может объяснить мне, что это значит?

 HACK - Use this as a global lock in the JNI layer
@SuppressWarnings({"unchecked", "unused"})
private static Class clazz = SnappyDecompressor.class;
 

Я понимаю, например, в Snappy, SnappyDecompressor.java по сути, это оболочка для быстрой реализации C / native, и для выполнения вызовов к этой реализации C уровень Java выполняет вызовы через интерфейс JNI.

Верхняя часть исходного кода для snappy (Java-оболочка), SnappyDecompressor.java находится здесь:

 package org.apache.hadoop.io.compress.snappy;
import java.io.IOException;
import java.nio.Buffer;
import java.nio.ByteBuffer;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.io.compress.Decompressor;

/**
 * A {@link Decompressor} based on the snappy compression algorithm.
 * http://code.google.com/p/snappy/
 */
public class SnappyDecompressor implements Decompressor {
  private static final Log LOG =
      LogFactory.getLog(SnappyCompressor.class.getName());
  private static final int DEFAULT_DIRECT_BUFFER_SIZE = 64 * 1024;

  // HACK - Use this as a global lock in the JNI layer
  @SuppressWarnings({"unchecked", "unused"})
  private static Class clazz = SnappyDecompressor.class;
 

Полный исходный код

Комментарии:

1. Я задаю искренний вопрос с целью обучения. Можете ли вы объяснить, почему вы сразу отклоняете честный вопрос без комментариев или объяснений?

2. JNI — это способ запуска собственного кода из Java. Похоже, они хотят определить поле, на которое будет ссылаться код JNI, на Java.

Ответ №1:

Как указано в комментарии: он используется из уровня JNI, по-видимому, для некоторой блокировки из уровня JNI. (смотрите полный исходный код декомпрессора)

Строки 76, 77:

 SnappyDecompressor_clazz = (*env)->GetStaticFieldID(env, clazz, "clazz",
                                                 "Ljava/lang/Class;");
 

Строка 83:

 jobject clazz = (*env)->GetStaticObjectField(env,thisj, SnappyDecompressor_clazz);
 

Строки со 100 по 102:

 LOCK_CLASS(env, clazz, "SnappyDecompressor");
const char* compressed_bytes = (const char*)(*env)->GetDirectBufferAddress(env, compressed_direct_buf);
UNLOCK_CLASS(env, clazz, "SnappyDecompressor");
 

Комментарии:

1. Спасибо. Похоже, что clazz используется в качестве мьютекса уровнем Java, чтобы сообщить машинному коду заблокировать / разблокировать область памяти (в данном случае compressed_direct_buf ), которая «принадлежит» экземпляру объекта Java (в данном случае SnappyDecompressor_clazz ).