2016-10-15 10 views
0

Я изучаю реализацию компрессора (на Java) для Snappy, Zlib и других. В верхней части исходного файла находится следующая строка. Может ли кто-нибудь объяснить мне, что это значит?Что такое clazz, используемый в исходном файле «private static Class clazz = SnappyDecompressor.class»?

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

Я понимаю, например, в Snappy, SnappyDecompressor.java, по существу, оболочка для мгновенных C/собственную реализации, а также совершать звонки в эту реализацию 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; 

Full source

+0

Я прошу подлинный вопрос с квесте обучения , Можете ли вы объяснить, почему вы немедленно голосуете честным вопросом без комментариев или объяснений? – nikk

+0

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

ответ

0

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

линии 76, 77:

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

Line 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"); 
+0

Спасибо. Похоже, clazz используется в качестве мьютекса слоем java для указания встроенного кода для блокировки/разблокировки области памяти (в данном случае 'compress_direct_buf'), которая« принадлежит »экземпляром Java-объекта (в данном случае, 'SnappyDecompressor_clazz'). – nikk