jni基礎

學習hadoop的過程當中涉及到了jni,瞭解了下jni的原理:java

jni,java native interface,它彌補了JAVA的與平臺無關這一優勢的不足,在JAVA實現跨平臺的同時,也能與其它語言(如C、C++)的動態庫進行交互,給其它語言發揮優點的機會。應用於性能要求高,有系統調用的時候。linux

具體步驟:oop

jni

建立TestJni.java性能

public class TestJni
{
    public native void print(String str);
    static
    {
        System.loadLibrary("MyJni");
    }
    public static void main(String[] args)
    {
        new TestJni().print("hello jni");
    }
}

print()方法是一個native方法,是要用C語言去實現的,在static塊中,指定加載須要的*.so。學習

編譯TestJni.java獲得class文件,從class文件獲得頭文件:javah –jni TestJni,獲得TestJni.h,複製TestJni.h->MyJni.c:spa

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>             
#include <stdio.h>
/* Header for class TestJni */

#ifndef _Included_TestJni
#define _Included_TestJni
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     TestJni
 * Method:    print
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_TestJni_print
  (JNIEnv *env, jobject obj, jstring str)
{
     jchar *s = (jchar *)(*env)->GetStringUTFChars(env, str, NULL);
    printf("content is %s\n", (char *)s);
     (*env)->ReleaseStringUTFChars(env, str,(const char*)s);
}

#ifdef __cplusplus
}
#endif
#endif

獲得libMyJni.so:   gcc -fPIC -shared -o libMyJni.so MyJni.c -I. -I/usr/java/jdk1.7.0_75/include -I/usr/java/jdk1.7.0_75/include/linux,加載相應的include的文件,執行java –Djava.library.path=. TestJni:code

content is hello jni
相關文章
相關標籤/搜索