2016-10-15 12 views
0

私は、Snappy、Zlibなどのコンプレッサー実装(Java)を研究しています。ソースファイルの最上部の近くに、この行があります。誰も私にそれが何を意味するのか説明できますか?私は理解して"private static class clazz = SnappyDecompressor.class"ソースファイルで使用されるclazzとは何ですか?

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

は、例えば、スナッピーに、SnappyDecompressor.javaは基本的にてきぱきとC /ネイティブ実装のラッパーであり、そのCの実装への呼び出しを行うために、Javaの層は、JNIインタフェースを介して呼び出しを行います。

スナッピー(Javaラッパー)のソースの上部には、SnappyDecompressor.javaはここにある:それは一見、JNI層から使用されている:コメントに示されているように

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からネイティブコードを実行する方法です。 Javaで、JNIコードが参照するフィールドを定義したいと思うように思えます。 – yshavit

答えて

0

JNI層からのいくつかのロックのために。 (see the full Decompressor source

線76、77:

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

ライン83:102に

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

行100:

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層のmutexとして使用され、Javaオブジェクトのインスタンスによって所有されているメモリ領域(この場合は 'compressed_direct_buf')をロック/ロック解除するようネイティブコードに指示します(この場合、 'SnappyDecompressor_clazz')です。 – nikk

関連する問題