学习hadoop的过程当中涉及到了jni,了解了下jni的原理:java
jni,java native interface,它弥补了JAVA的与平台无关这一优势的不足,在JAVA实现跨平台的同时,也能与其它语言(如C、C++)的动态库进行交互,给其它语言发挥优点的机会。应用于性能要求高,有系统调用的时候。linux
具体步骤:oop
建立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