Android Studio3.0开发JNI流程------JNI函数

本文详细介绍了Android Studio3.0中JNI的使用,包括接口函数表、版本信息、类操作、异常处理、全局及局部引用、对象操作、访问对象域、调用实例方法等,提供了丰富的函数调用示例和异常处理方法。
摘要由CSDN通过智能技术生成

JNI函数

    本章为JNI函数提供参考信息。其中列出了全部JNI函数,同时也给出了JNI函数表的准确布局。注意:“必须”一词用于约束JNI编程人员。例如,当说明某个JNI函数必须接收非空对象时,就应确保不要向该JNI函数传递NULL值。这时,JNI实现将无需在该JNI函数中执行NULL指针检查。

接口函数表

    每个函数均可通过JNIEnv参数以固定偏移量进行访问。JNIEnv的类型是一个指针,指向存储全部JNI函数指针的结构。注意:前三项留作将来与COM兼容。此外,我们在函数表开头部分也留出来多个NULL项,从而可将将来与类有关的JNI操作添加到FindClass后面,而非函数表的末尾。注意,函数表可在所有JNI接口指针间共享。

const struct JNINativeInterface ... = {
    NULL,
    NULL,
    NULL,
    NULL,
    GetVersion,

    DefineClass,
    FindClass,
    NULL,
    NULL,
    NULL,
    GetSuperclass,
    IsAssignableFrom,
    NULL,

    Throw,
    ThrowNew,
    ExceptionOccurred,
    ExceptionDescribe,
    ExceptionClear,
    FatalError,
    NULL,
    NULL,

    NewGlobalRef,
    DeleteGlobalRef,
    DeleteLocalRef,
    IsSameObject,
    NULL,
    NULL,
    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,
};

版本信息

GetVersion( )返回本地方法接口的版本。

jint GetVersion(JNIEnv *env);

参数 :
env为JNI接口指针

返回值:
高16位返回主版本号,低16位返回次版本号
在JDK1.1 中,GetVersion()返回0x00010001

类操作

DefineClass( )从原始类数据的缓冲区中加载类。

jclass DefineClass(JNIEnv *env, jobject loader, const jbyte *buf, jsize bufLen);

参数:
env:JNI 接口指针。
loader:分派给所定义的类的类加载器。
buf:包含.class文件数据的缓冲区。
bufLen:缓冲区长度。

返回值:
返回Java类对象如果出错则返回NULL

抛出的异常:
- ClassFormatError:如果类数据指定的类无效。
- ClassCircularityError:如果类或接口是自身的超类或超接口。
- OutOfMemoryError:如果系统内存不足。

FindClass( ) 该函数用于加载本地定义的类。它将搜索由CLASSPATH环境变量为具有指定名称的类所指定的目录和zip文件。

jclass FindClass(JNIEnv *env, const char *name);

参数:
env:JNI接口指针。
name:类全名(即包名后跟类名,之间由“/”分隔)。如果该名称以“[”(数组签名字符)打头,则返回一个数组类。

返回值:
返回类对象全名。如果找不到该类,则返回NULL。

抛出:
- ClassFormatError:如果类数据指定的类无效。
- ClassCircularityError:如果类或接口是自身的超类或超接口。
- NoClassDefFoundError:如果找不到所请求的类或接口的定义。
- OutOfMemoryError:如果系统内存不足。

GetSuperclass( ) 如果clazz代表类而非类object,则该函数返回由clazz所指定的类的超类。如果clazz指定类object或代表某个接口,则该函数返回NULL。

jclass GetSuperclass(JNIEnv *env, jclass clazz);

参数:
env:JNI接口指针。
clazz:Java类对象。

返回值:
由clazz所代表的类的超类或NULL

IsAssignableFrom ( ) 确定clazz1的对象是否可安全地强制转换为clazz2。

jboolean IsAssignableFrom(JNIEnv *env, jclass clazz1, jclass clazz2);

参数:
env:JNI接口指针。
clazz1:第一个类参数。
clazz2:第二个类参数。

返回值:
下列某个情况为真时返回JNI_TRUE
第一及第二个类参数引用同一个Java类
第一个类是第二个类的子类
第二个类是第一个类的某个接口

异常

Throw( ) 抛出java.lang.Throwable对象。

jint Throw(JNIEnv *env, jthrowable obj);

参数:
env:JNI接口指针。
obj:java.lang.Throwable对象。

返回值:
成功时返回0,失败时返回负数。

抛出:
java.lang.Throwable对象obj

ThrowNew( )利用指定类的消息(由message指定)构造异常对象并抛出该异常。

jint ThrowNew(JNIEnv *env, jclass clazz, const char *message);

参数:
env:JNI接口指针。
clazz:java.lang.Throwable的子类。
message:用于构造java.lang.Throwable对象的消息。

返回值:
成功时返回0,失败时返回负数。

抛出:
新构造的java.lang.Throwable对象。

ExceptionOccurred( ) 确定是否某个异常正被抛出。在平台相关代码调用ExceptionClear()或Java代码处理该异常前,异常将始终保持抛出状态。

jthrowable ExceptionOccurred(JNIEnv *env);

参数:
env:JNI接口指针。

返回值:
返回正被抛出的异常对象,如果当前无异常被抛出,则返回NULL

ExceptionDescribe( ) 将异常及堆栈的回溯输出到系统错误报告信道(例如 stderr)。该例程可便利调试操作。

void ExceptionDescribe(JNIEnv *env);

参数:
env:JNI接口指针。

ExceptionClear( ) 清除当前抛出的任何异常。如果当前无异常,则此例程不产生任何效果。

void ExceptionClear(JNIEnv *env);

参数:
env:JNI接口指针。

FatalError( )抛出致命错误并且不希望虚拟机进行修复。该函数无返回值。

void FatalError(JNIEnv *env, const char *msg);

参数:
env:JNI接口指针。
msg:错误消息。

全局及局部引用

NewGlobalRef( ) 创建obj参数所引用对象的新全局引用。obj参数既可以是全局引用,也可以是局部引用。全局引用通过调用DeleteGlobalRef()来显式撤消。

jobject NewGlobalRef(JNIEnv *env, jobject obj);

参数:
env:JNI接口指针。
obj:全局或局部引用。

返回值:
返回全局引用。如果系统内存不足则返回NULL

DeleteGlobalRef( ) 删除globalRef所指向的全局引用。

void DeleteGlobalRef(JNIEnv *env, jobject globalRef);

参数:
env:JNI接口指针。
globalRef:全局引用。

DeleteLocalRef( ) 删除localRef所指向的局部引用。

void DeleteLocalRef(JNIEnv *env, jobject localRef);

参数:
env:JNI接口指针。
localRef:局部引用。

对象操作

AllocObject( ) 分配新Java对象而不调用该对象的任何构造函数。返回该对象的引用。clazz参数务必不要引用数组类。

jobject AllocObject(JNIEnv *env, jclass clazz);

参数:
env:JNI接口指针。
clazz:Java类对象。

返回值:
返回Java对象。如果无法构造该对象,则返回NULL

抛出:
InstantiationException:如果该类为一个接口或抽象类
OutOfMemoryError:如果系统内存不足

NewObject( ) NewObjectA

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值