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
- Java -- JNI提供的操作接口
- Java连接oracle的类,提供操作接口
- SPI模块的JNI方法提供Java访问HAL层服务接口
- SPI模块的JNI方法提供Java访问HAL层服务接口【转】
- Java 提供接口的安全问题
- JNI调用java的接口
- Java-利用Spring提供的Resource/ResourceLoader接口操作资源文件
- BlackBerry Java 提供的推送接口
- java提供的函数式接口
- java中非常有用的接口jni
- java jni System.loadLibrary 接口的理解
- Android硬件抽象层编写JNI方法提供Java访问硬件服务接口
- 在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口 (学习老罗的)
- Java中JNI接口
- 利用mysql提供的c语言接口操作数据库
- 利用mysql提供的c语言接口操作数据库
- Spring提供的Resource/ResourceLoader接口操作资源文件
- 接口的提供方式
- 【一步一步学习VBA】WORD 创建表格并合并表格
- ubuntu 14.04 设置sublime 为默认文本编辑器
- 开源网站
- Linux统计文件行数
- 贪心算法基本思想和典型例题
- Java -- JNI提供的操作接口
- Java内存泄露原因详解
- Android 开发问题解决方法记录:Dx unsupported class file version 52.0
- webpack设置代理
- ndk编程 生成头文件
- Merge Sorted Array
- HDU5804&BestCoder Round #86 1001 Price List
- 正则表达式参考手册
- shell脚本获取某个目录下文件的个数