Java -- JNI提供的操作接口

来源:互联网 发布:淘宝放单平台 编辑:程序博客网 时间:2024/06/02 03:04

Java -- JNI提供的操作接口


我们知道一个JNI本地方法的头两个参数是有限制的。第一个参数一定是一个JNI接口指针对象JNIEnv *env;第二个参数则根据在Java中声明的native方法是否为静态而略有不同。如果Java代码中声明的native方法是非静态的,则第二个参数是一个代表当前Java对象的引用;如果是声明是静态的,则第二个参数是指向当前类的引用。除去这两个特殊的参数外,剩余的参数都跟Java声明中的参数对应,不过要转换成JNI中的对应类型,这在之前有过讲述。下面是一个简单的JNI使用示例:
package pkg;  class Cls {      native double f(int i, String s);      ... } 
The C function with the long mangled name Java_pkg_Cls_f_ILjava_lang_String_2 implements native method f:Code Example 2-1 Implementing a Native Method Using Cjdouble Java_pkg_Cls_f__ILjava_lang_String_2 (     JNIEnv *env,        /* interface pointer */     jobject obj,        /* "this" pointer */     jint i,             /* argument #1 */     jstring s)          /* argument #2 */{     /* Obtain a C-copy of the Java string */     const char *str = (*env)->GetStringUTFChars(env, s, 0);     /* process the string */     ...     /* Now we are done with str */     (*env)->ReleaseStringUTFChars(env, s, str);     return ...}
Note that we always manipulate Java objects using the interface pointer env . Using C++, you can write a slightly cleaner version of the code, as shown in Code Example 2-2:Code Example 2-2 Implementing a Native Method Using C++extern "C" /* specify the C calling convention */  jdouble Java_pkg_Cls_f__ILjava_lang_String_2 (      JNIEnv *env,        /* interface pointer */      jobject obj,        /* "this" pointer */      jint i,             /* argument #1 */      jstring s)          /* argument #2 */ {      const char *str = env->GetStringUTFChars(s, 0);      ...      env->ReleaseStringUTFChars(s, str);      return ... } 
native方法是C/C++实现的方法,两者在env参数的使用上有些许区别;具体可看代码中的JNIEnv *env变量的使用。在C版本中,使用env多了一次解引用和参数传递。
这里的JNIEnv就是JNI提供地、可以让开发者调用JNI接口方法的一种类型。JNI提供了很多接口方法,供开发者操作数组、变量、字符串、异常、调用Java方法和获取Java字段等。Java虚拟机会为JNI维护一张方法表:
const struct JNINativeInterface ... = {    NULL,    NULL,    NULL,    NULL,    GetVersion,    DefineClass,    FindClass,    FromReflectedMethod,    FromReflectedField,    ToReflectedMethod,    GetSuperclass,    IsAssignableFrom,    ToReflectedField,    Throw,    ThrowNew,    ExceptionOccurred,    ExceptionDescribe,    ExceptionClear,    FatalError,    PushLocalFrame,    PopLocalFrame,    NewGlobalRef,    DeleteGlobalRef,    DeleteLocalRef,    IsSameObject,    NewLocalRef,    EnsureLocalCapacity,    AllocObject,    NewObject,    NewObjectV,    NewObjectA,    GetObjectClass,    IsInstanceOf,    GetMethodID,    CallObjectMethod,    CallObjectMethodV,    CallObjectMethodA,    CallBooleanMethod,    CallBooleanMethodV,    CallBooleanMethodA,    CallByteMethod,    CallByteMethodV,    CallByteMethodA,    CallCharMethod,    CallCharMethodV,    CallCharMethodA,    CallShortMethod,    CallShortMethodV,    CallShortMethodA,    CallIntMethod,    CallIntMethodV,    CallIntMethodA,    CallLongMethod,    CallLongMethodV,    CallLongMethodA,    CallFloatMethod,    CallFloatMethodV,    CallFloatMethodA,    CallDoubleMethod,    CallDoubleMethodV,    CallDoubleMethodA,    CallVoidMethod,    CallVoidMethodV,    CallVoidMethodA,    CallNonvirtualObjectMethod,    CallNonvirtualObjectMethodV,    CallNonvirtualObjectMethodA,    CallNonvirtualBooleanMethod,    CallNonvirtualBooleanMethodV,    CallNonvirtualBooleanMethodA,    CallNonvirtualByteMethod,    CallNonvirtualByteMethodV,    CallNonvirtualByteMethodA,    CallNonvirtualCharMethod,    CallNonvirtualCharMethodV,    CallNonvirtualCharMethodA,    CallNonvirtualShortMethod,    CallNonvirtualShortMethodV,    CallNonvirtualShortMethodA,    CallNonvirtualIntMethod,    CallNonvirtualIntMethodV,    CallNonvirtualIntMethodA,    CallNonvirtualLongMethod,    CallNonvirtualLongMethodV,    CallNonvirtualLongMethodA,    CallNonvirtualFloatMethod,    CallNonvirtualFloatMethodV,    CallNonvirtualFloatMethodA,    CallNonvirtualDoubleMethod,    CallNonvirtualDoubleMethodV,    CallNonvirtualDoubleMethodA,    CallNonvirtualVoidMethod,    CallNonvirtualVoidMethodV,    CallNonvirtualVoidMethodA,    GetFieldID,    GetObjectField,    GetBooleanField,    GetByteField,    GetCharField,    GetShortField,    GetIntField,    GetLongField,    GetFloatField,    GetDoubleField,    SetObjectField,    SetBooleanField,    SetByteField,    SetCharField,    SetShortField,    SetIntField,    SetLongField,    SetFloatField,    SetDoubleField,    GetStaticMethodID,    CallStaticObjectMethod,    CallStaticObjectMethodV,    CallStaticObjectMethodA,    CallStaticBooleanMethod,    CallStaticBooleanMethodV,    CallStaticBooleanMethodA,    CallStaticByteMethod,    CallStaticByteMethodV,    CallStaticByteMethodA,    CallStaticCharMethod,    CallStaticCharMethodV,    CallStaticCharMethodA,    CallStaticShortMethod,    CallStaticShortMethodV,    CallStaticShortMethodA,    CallStaticIntMethod,    CallStaticIntMethodV,    CallStaticIntMethodA,    CallStaticLongMethod,    CallStaticLongMethodV,    CallStaticLongMethodA,    CallStaticFloatMethod,    CallStaticFloatMethodV,    CallStaticFloatMethodA,    CallStaticDoubleMethod,    CallStaticDoubleMethodV,    CallStaticDoubleMethodA,    CallStaticVoidMethod,    CallStaticVoidMethodV,    CallStaticVoidMethodA,    GetStaticFieldID,    GetStaticObjectField,    GetStaticBooleanField,    GetStaticByteField,    GetStaticCharField,    GetStaticShortField,    GetStaticIntField,    GetStaticLongField,    GetStaticFloatField,    GetStaticDoubleField,    SetStaticObjectField,    SetStaticBooleanField,    SetStaticByteField,    SetStaticCharField,    SetStaticShortField,    SetStaticIntField,    SetStaticLongField,    SetStaticFloatField,    SetStaticDoubleField,    NewString,    GetStringLength,    GetStringChars,    ReleaseStringChars,    NewStringUTF,    GetStringUTFLength,    GetStringUTFChars,    ReleaseStringUTFChars,    GetArrayLength,    NewObjectArray,    GetObjectArrayElement,    SetObjectArrayElement,    NewBooleanArray,    NewByteArray,    NewCharArray,    NewShortArray,    NewIntArray,    NewLongArray,    NewFloatArray,    NewDoubleArray,    GetBooleanArrayElements,    GetByteArrayElements,    GetCharArrayElements,    GetShortArrayElements,    GetIntArrayElements,    GetLongArrayElements,    GetFloatArrayElements,    GetDoubleArrayElements,    ReleaseBooleanArrayElements,    ReleaseByteArrayElements,    ReleaseCharArrayElements,    ReleaseShortArrayElements,    ReleaseIntArrayElements,    ReleaseLongArrayElements,    ReleaseFloatArrayElements,    ReleaseDoubleArrayElements,    GetBooleanArrayRegion,    GetByteArrayRegion,    GetCharArrayRegion,    GetShortArrayRegion,    GetIntArrayRegion,    GetLongArrayRegion,    GetFloatArrayRegion,    GetDoubleArrayRegion,    SetBooleanArrayRegion,    SetByteArrayRegion,    SetCharArrayRegion,    SetShortArrayRegion,    SetIntArrayRegion,    SetLongArrayRegion,    SetFloatArrayRegion,    SetDoubleArrayRegion,    RegisterNatives,    UnregisterNatives,    MonitorEnter,    MonitorExit,    GetJavaVM,    GetStringRegion,    GetStringUTFRegion,    GetPrimitiveArrayCritical,    ReleasePrimitiveArrayCritical,    GetStringCritical,    ReleaseStringCritical,    NewWeakGlobalRef,    DeleteWeakGlobalRef,    ExceptionCheck,    NewDirectByteBuffer,    GetDirectBufferAddress,    GetDirectBufferCapacity,    GetObjectRefType  };
JNI提供的函数是比较丰富的。如果对JNI函数不熟悉,我们可以查看JDK文档,里面对JNI部分做了完整说明,其中就包含对各个方法的使用介绍。
JNI文档路径:/jdk-7u79/jdk-7u79-docs-all/docs/technotes/guides/jni/index.html。


0 0
原创粉丝点击