C/C++调用java---JNI常用函数

DefineClass   

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

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

参数:

env:JNI 接口指针。

loader:分派给所定义的类的类加载器。

buf:包含 .class 文件数据的缓冲区。

bufLen:缓冲区长度。

返回值:

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

抛出:

ClassFormatError:如果类数据指定的类无效。

ClassCircularityError:如果类或接口是自身的超类或超接口。

OutOfMemoryError:如果系统内存不足。

FindClass     

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

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

参数:

env:JNI 接口指针。

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

返回值:

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

抛出:

ClassFormatError:如果类数据指定的类无效。

ClassCircularityError:如果类或接口是自身的超类或超接口。

NoClassDefFoundError:如果找不到所请求的类或接口的定义。

OutOfMemoryError:如果系统内存不足。

GetSuperclass

jclass  GetSuperclass(JNIEnv *env, jclass clazz);        

如果 clazz 代表类而非类 object,则该函数返回由 clazz 所指定的类的超类。

如果 clazz 指定类 object 或代表某个接口,则该函数返回NULL。

参数:

env:JNI 接口指针。

clazz:Java 类对象。

返回值:

由 clazz 所代表的类的超类或 NULL。

IsAssignableFrom  

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

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

参数:

env:JNI 接口指针。

clazz1:第一个类参数。

clazz2:第二个类参数。

返回值:

下列某个情况为真时返回 JNI_TRUE:

第一及第二个类参数引用同一个 Java 类。

第一个类是第二个类的子类。

第二个类是第一个类的某个接口。

异常

Throw

jint Throw(JNIEnv *env, jthrowable obj);        

抛出 java.lang.Throwable 对象。

参数:

env:JNI 接口指针。

obj:java.lang.Throwable 对象。

返回值:

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

抛出:

java.lang.Throwable 对象 obj。

ThrowNew  

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

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

参数:

env:JNI 接口指针。

clazz:java.lang.Throwable 的子类。

message:用于构造java.lang.Throwable 对象的消息。

返回值:

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

抛出:

新构造的 java.lang.Throwable 对象。

ExceptionOccurred

jthrowable  ExceptionOccurred(JNIEnv *env);        

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

参数:

env:JNI 接口指针。

返回值:

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

ExceptionDescribe   

void  ExceptionDescribe(JNIEnv *env);        

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

参数:

env:JNI 接口指针。

ExceptionClear  

void  ExceptionClear(JNIEnv *env);        

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

参数:

env:JNI 接口指针。

FatalError

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

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

参数:

env:JNI 接口指针。

msg:错误消息。

全局及局部引用

NewGlobalRef    

jobject  NewGlobalRef(JNIEnv *env, jobject obj);        

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

参数:

env:JNI 接口指针。

obj:全局或局部引用。

返回值:

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

DeleteGlobalRef  

void  DeleteGlobalRef(JNIEnv *env, jobject globalRef);        

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

参数:

env:JNI 接口指针。

globalRef:全局引用。

DeleteLocalRef  

void   DeleteLocalRef(JNIEnv *env, jobject localRef);        

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

参数:

env:JNI 接口指针。

localRef:局部引用。

对象操作

AllocObject  

jobject  AllocObject(JNIEnv *env, jclass clazz);        

分配新 Java 对象而不调用该对象的任何构造函数。返回该对象的引用。

clazz 参数务必不要引用数组类。

参数:

env:JNI 接口指针。

clazz:Java 类对象。

返回值:

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

抛出:

InstantiationException:如果该类为一个接口或抽象类。

OutOfMemoryError:如果系统内存不足。

NewObject        

NewObjectA        

NewObjectV

jobject  NewObject(JNIEnv *env, jclass clazz, jmethodID methodID, ...);        

jobject NewObjectA(JNIEnv *env,jclass clazz, jmethodID methodID, jvalue *args);        

jobject NewObjectV(JNIEnv *env,jclass clazz, jmethodID methodID, va_list args);  

构造新 Java 对象。方法 ID指示应调用的构造函数方法。该 ID 必须通过调用 GetMethodID() 获得,且调用时的方法名必须为 ,而返回类型必须为 void (V)。

clazz参数务必不要引用数组类。

NewObject

编程人员应将传递给构造函数的所有参数紧跟着放在 methodID 参数的后面。NewObject() 收到这些参数后,将把它们传给编程人员所要调用的 Java 方法。

NewObjectA

编程人员应将传递给构造函数的所有参数放在 jvalues 类型的数组 args 中,该数组紧跟着放在 methodID 参数的后面。NewObject() 收到数组中的这些参数后,将把它们传给编程人员所要调用的 Java 方法。

NewObjectV

编程人员应将传递给构造函数的所有参数放在 va_list 类型的参数 args 中,该参数紧跟着放在 methodID 参数的后面。NewObject() 收到这些参数后,将把它们传给编程人员所要调用的 Java 方法。

参数:

env:JNI 接口指针。

clazz:Java 类对象。

methodID:构造函数的方法 ID。

NewObject 的其它参数:

传给构造函数的参数。

NewObjectA 的其它参数:

args:传给构造函数的参数数组。

NewObjectV 的其它参数:

args:传给构造函数的参数 va_list。

返回值:

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

抛出:

InstantiationException:如果该类为接口或抽象类。

OutOfMemoryError:如果系统内存不足。

构造函数抛出的任何异常。

        

GetObjectClass     

jclass  GetObjectClass(JNIEnv *env, jobject obj);        

返回对象的类。

参数:

env:JNI 接口指针。

obj:Java 对象(不能为 NULL)。

返回值:

返回 Java 类对象。

        

IsInstanceOf       

jboolean  IsInstanceOf(JNIEnv *env, jobject obj, jclass clazz);        

测试对象是否为某个类的实例。

参数:

env:JNI 接口指针。

obj:Java 对象。

clazz:Java 类对象。

返回值:

如果可将 obj 强制转换为 clazz,则返回 JNI_TRUE。否则返回 JNI_FALSE。NULL 对象可强制转换为任何类。

IsSameObject

jbooleanIsSameObject(JNIEnv *env, jobject ref1, jobject ref2);        

测试两个引用是否引用同一 Java 对象。

参数:

env:JNI 接口指针。

ref1:Java 对象。

ref2:Java 对象。

返回值:

如果 ref1 和 ref2 引用同一 Java 对象或均为 NULL,则返回 JNI_TRUE。否则返回 JNI_FALSE。

调用实例方法

GetMethodID   

jmethodID  GetMethodID(JNIEnv *env, jclass clazz, const char *name, const char *sig);        

返回类或接口实例(非静态)方法的方法 ID。方法可在某个 clazz 的超类中定义,也可从 clazz 继承。该方法由其名称和签名决定。

GetMethodID() 可使未初始化的类初始化。

要获得构造函数的方法 ID,应将  作为方法名,同时将 void (V) 作为返回类型。

参数:

env:JNI 接口指针。

clazz:Java 类对象。

name:0 终结的 UTF-8 字符串中的方法名。

sig:0 终结的 UTF-8 字符串中的方法签名。

返回值:

方法 ID,如果找不到指定的方法,则为 NULL。

抛出:

NoSuchMethodError:如果找不到指定方法。

ExceptionInInitializerError:如果由于异常而导致类初始化程序失败。

OutOfMemoryError:如果系统内存不足。

CallMethod 例程        

CallMethodA 例程        

CallMethodV 例程  

NativeType   CallMethod(JNIEnv*env, jobject obj, jmethodID methodID, ...);       

NativeType  CallMethodA(JNIEnv *env, jobject obj,jmethodID methodID, jvalue *args);        

NativeType  CallMethodV(JNIEnv *env, jobject obj,   jmethodID methodID, va_list args);      

这三个操作的方法用于从本地方法调用Java 实例方法。它们的差别仅在于向其所调用的方法传递参数时所用的机制。        

这三个操作将根据所指定的方法 ID 调用 Java 对象的实例(非静态)方法。参数 methodID 必须通过调用 GetMethodID() 来获得。

当这些函数用于调用私有方法和构造函数时,方法 ID 必须从 obj 的真实类派生而来,而不应从其某个超类派生。

CallMethod例程

编程人员应将要传给方法的所有参数紧跟着放在 methodID 参数之后。CallMethod 例程接受这些参数并将其传给编程人员所要调用的 Java 方法。

CallMethodA 例程

编 程人员应将要传给方法的所有参数放在紧跟在 methodID 参数之后的 jvalues 类型数组 args 中。 CallMethodA routine 接受这些数组中的参数并将其传给编程人员所要调用的 Java 方 法。

CallMethodV例程

编程人员将方法的所有参数放在紧跟着在 methodID 参数之后的 va_list 类型参数变量中。CallMethodV routine 接受这些参数并将其传给编程人员所要调用的 Java 方法。

下表根据结果类型说明了各个方法调用例程。用户应将CallMethod 中的 type 替换为所调用方法的 Java 类型(或使用表中的实际方法调用例程名),同时将 NativeType 替换为该例程相应的本地类型。

表 4-3 实例方法调用例程

CallMethod 例程名    本地类型

CallVoidMethod() CallVoidMethodA() CallVoidMethodV()    void

CallObjectMethod() CallObjectMethodA() CallObjectMethodV()    jobject

CallBooleanMethod() CallBooleanMethodA() CallBooleanMethodV()    jboolean

CallByteMethod() CallByteMethodA() CallByteMethodV()    jbyte

CallCharMethod() CallCharMethodA() CallCharMethodV()    jchar

CallShortMethod() CallShortMethodA() CallShortMethodV()    jshort

CallIntMethod() CallIntMethodA() CallIntMethodV()    jint

CallLongMethod() CallLongMethodA() CallLongMethodV()    jlong

CallFloatMethod() CallFloatMethodA() CallFloatMethodV()    jfloat

CallDoubleMethod() CallDoubleMethodA() CallDoubleMethodV()    jdouble

参数:

env:JNI 接口指针。

obj:Java 对象。

methodID:方法 ID。

CallMethod例程的其它参数:

要传给 Java 方法的参数。

CallMethodA例程的其它参数:

args:参数数组。

CallMethodV例程的其它参数:

args:参数的 va_list。

返回值:

返回调用 Java 方法的结果。

抛出:

执行 Java 方法时抛出的异常。

字符串操作

NewString

jstring   NewString(JNIEnv *env, const jchar *unicodeChars, jsize len);        

利用 Unicode 字符数组构造新的 java.lang.String 对象。

参数:

env:JNI 接口指针。

unicodeChars:指向 Unicode 字符串的指针。

len:Unicode 字符串的长度。

返回值:

Java 字符串对象。如果无法构造该字符串,则为 NULL。

抛出:

OutOfMemoryError:如果系统内存不足。

        

GetStringLength    

jsize   GetStringLength(JNIEnv *env, jstring string);        

返回 Java 字符串的长度(Unicode 字符数)。

参数:

env:JNI 接口指针。

string:Java 字符串对象。

返回值:

Java 字符串的长度。

GetStringChars   

const   jchar *   GetStringChars(JNIEnv *env, jstring string,   jboolean *isCopy);        

返回指向字符串的 Unicode 字符数组的指针。该指针在调用 ReleaseStringchars() 前一直有效。

如果 isCopy 非空,则在复制完成后将 *isCopy 设为 JNI_TRUE。如果没有复制,则设为JNI_FALSE。

参数:

env:JNI 接口指针。

string:Java 字符串对象。

isCopy:指向布尔值的指针。

返回值:

指向 Unicode 字符串的指针,如果操作失败,则返回NULL。

ReleaseStringChars   

void    ReleaseStringChars(JNIEnv *env, jstring string,   const jchar *chars);       

通知虚拟机平台相关代码无需再访问 chars。参数 chars 是一个指针,可通过 GetStringChars() 从 string 获得。

参数:

env:JNI 接口指针。

string:Java 字符串对象。

chars:指向 Unicode 字符串的指针。

NewStringUTF     

jstring   NewStringUTF(JNIEnv *env, const char *bytes);        

利用 UTF-8 字符数组构造新 java.lang.String 对象。

参数:

env:JNI 接口指针。如果无法构造该字符串,则为 NULL。

bytes:指向 UTF-8 字符串的指针。

返回值:

Java 字符串对象。如果无法构造该字符串,则为 NULL。

抛出:

OutOfMemoryError:如果系统内存不足。

        

GetStringUTFLength   

jsize   GetStringUTFLength(JNIEnv *env, jstring string);        

以字节为单位返回字符串的 UTF-8 长度。

参数:

env:JNI 接口指针。

string:Java 字符串对象。

返回值:

返回字符串的 UTF-8 长度。

GetStringUTFChars  

const  char*  GetStringUTFChars(JNIEnv *env, jstring string,  jboolean *isCopy);       

返回指向字符串的 UTF-8 字符数组的指针。该数组在被ReleaseStringUTFChars() 释放前将一直有效。

如果 isCopy 不是 NULL,*isCopy 在复制完成后即被设为 JNI_TRUE。如果未复制,则设为 JNI_FALSE。

参数:

env:JNI 接口指针。

string:Java 字符串对象。

isCopy:指向布尔值的指针。

返回值:

指向 UTF-8 字符串的指针。如果操作失败,则为 NULL。

ReleaseStringUTFChars     

void    ReleaseStringUTFChars(JNIEnv *env, jstring string,  const char *utf);       

通知虚拟机平台相关代码无需再访问 utf。utf 参数是一个指针,可利用 GetStringUTFChars() 从 string 获得。

参数:

env:JNI 接口指针。

string:Java 字符串对象。

utf:指向 UTF-8 字符串的指针。

数组操作

        

GetArrayLength   

jsize  GetArrayLength(JNIEnv *env, jarray array);        

返回数组中的元素数。

参数:

env:JNI 接口指针。

array:Java 数组对象。

返回值:

数组的长度。

NewObjectArray

jarray  NewObjectArray(JNIEnv *env, jsize length,   jclass elementClass, jobject initialElement);        

构造新的数组,它将保存类 elementClass 中的对象。所有元素初始值均设为 initialElement。

参数:

env:JNI 接口指针。

length:数组大小。

elementClass:数组元素类。

initialElement:初始值。

返回值:

Java 数组对象。如果无法构造数组,则为 NULL。

抛出:

OutOfMemoryError:如果系统内存不足。

GetObjectArrayElement      

jobject    GetObjectArrayElement(JNIEnv *env,  jobjectArray array, jsize index);       

返回 Object 数组的元素。

参数:

env:JNI 接口指针。

array:Java 数组。

index:数组下标。

返回值:

Java 对象。

抛出:

ArrayIndexOutOfBoundsException:如果 index 不是数组中的有效下标。

SetObjectArrayElement    

void   SetObjectArrayElement(JNIEnv *env, jobjectArray array,   jsize index, jobject value);        

设置 Object 数组的元素。

参数:

env:JNI 接口指针。

array:Java 数组。

index:数组下标。

value:新值。

抛出:

ArrayIndexOutOfBoundsException:如果 index 不是数组中的有效下标。

ArrayStoreException:如果 value 的类不是数组元素类的子类。

NewArray 例程        

ArrayType   NewArray(JNIEnv*env, jsize length);        

用 于构造新基本类型数组对象的一系列操作。表 4-8 说明了特定的基本类型数组构造函数。用户应把 NewArray 替换为某个实际的基本类型数组构造函数例程名(见下表),然后将 ArrayType替换 为该例程相应的数组类型。

表 4-8 NewArray 数组构造函数系列

NewArray 例程    数组类型

NewBooleanArray()    jbooleanArray

NewByteArray()    jbyteArray

NewCharArray()    jcharArray

NewShortArray()    jshortArray

NewIntArray()    jintArray

NewLongArray()    jlongArray

NewFloatArray()    jfloatArray

NewDoubleArray()    jdoubleArray

参数:

env:JNI 接口指针。

length:数组长度。

返回值:

Java 数组。如果无法构造该数组,则为 NULL。

GetArrayElements 例程  

NativeType  *GetArrayElements(JNIEnv *env,  ArrayType array, jboolean*isCopy);       

一 组返回基本类型数组体的函数。结果在调用相应的 ReleaseArrayElements()函数前将一直 有效。由于返回的数组可能是 Java 数组的副本,因此对返回数组的更改不必在基本类型数组中反映出来,直到调用了 ReleaseArrayElements()。

如果 isCopy 不是 NULL,*isCopy 在复制完成后即被设为 JNI_TRUE。如果未复制,则设为 JNI_FALSE。

下表说明了特定的基本类型数组元素访问器。应进行下列替换;

将 GetArrayElements 替换为表中某个实际的基本类型元素访问器例程名。

将 ArrayType 替换为对应的数组类型。

将 NativeType 替换为该例程对应的本地类型。

不管布尔数组在 Java 虚拟机中如何表示,GetBooleanArrayElements() 将始终返回一个 jbooleans 类型的指针,其中每一字节代表一个元素(开包表示)。内存中将确保所有其它类型的数组为连续的。

表4-9 GetArrayElements 访问器例程系列

GetArrayElements 例程    数组类型    本地类型

GetBooleanArrayElements()    jbooleanArray    jboolean

GetByteArrayElements()    jbyteArray    jbyte

GetCharArrayElements()    jcharArray    jchar

GetShortArrayElements()    jshortArray    jshort

GetIntArrayElements()    jintArray    jint

GetLongArrayElements()    jlongArray    jlong

GetFloatArrayElements()    jfloatArray    jfloat

GetDoubleArrayElements()    jdoubleArray    jdouble

参数:

env:JNI 接口指针。

array:Java 字符串对象。

isCopy:指向布尔值的指针。

返回值:

返回指向数组元素的指针,如果操作失败,则为 NULL。

ReleaseArrayElements 例程

void   ReleaseArrayElements(JNIEnv *env,   ArrayType array, NativeType *elems, jintmode);        

通 知虚拟机平台相关代码无需再访问 elems 的一组函数。elems 参数是一个通过使用对应的 GetArrayElements() 函数由 array 导出的指针。必要时,该函数将把 对 elems 的修改复制回基本类型数组。

mode参数将提供有关如何释放数组缓冲区的信息。如果elems 不是 array 中数组元素的副本,mode将无效。否则,mode 将具有下表所述的功能:

表 4-10 基本类型数组释放模式

模式    动作

0    复制回内容并释放 elems 缓冲区

JNI_COMMIT    复制回内容但不释放 elems 缓冲区

JNI_ABORT    释放缓冲区但不复制回变化

多数情况下,编程人员将把“0”传给 mode 参数以确保固定的数组和复制的数组保持一致。其它选项可以使编程人员进一步控制内存管理,但使用时务必慎重。

下表说明了构成基本类型数组撤消程序系列的特定例程。应进行如下替换;

将 ReleaseArrayElements 替换为表 4-11 中的某个实际基本类型数组撤消程序例程名。

将 ArrayType 替换为对应的数组类型。

将 NativeType 替换为该例程对应的本地类型。

表 4-11 ReleaseArrayElements 数组例程系列

ReleaseArrayElements 例程    数组类型    本地类型

ReleaseBooleanArrayElements()    jbooleanArray    jboolean

ReleaseByteArrayElements()    jbyteArray    jbyte

ReleaseCharArrayElements()    jcharArray    jchar

ReleaseShortArrayElements()    jshortArray    jshort

ReleaseIntArrayElements()    jintArray    jint

ReleaseLongArrayElements()    jlongArray    jlong

ReleaseFloatArrayElements()    jfloatArray    jfloat

ReleaseDoubleArrayElements()    jdoubleArray    jdouble

参数:

env:JNI 接口指针。

array:Java 数组对象。

elems:指向数组元素的指针。

mode:释放模式。

GetArrayRegion 例程   

void    GetArrayRegion(JNIEnv *env, ArrayType array,  jsize start, jsize len, NativeType *buf);        

将基本类型数组某一区域复制到缓冲区中的一组函数。

下表说明了特定的基本类型数组元素访问器。应进行如下替换:

将 GetArrayRegion 替换为表 4-12 中的某个实际基本类型元素访问器例程名。

将 ArrayType 替换为对应的数组类型。

将 NativeType 替换为该例程对应的本地类型。

表 4-12 GetArrayRegion 数组访问器例程系列

GetArrayRegion 例程    数组类型    本地类型

GetBooleanArrayRegion()    jbooleanArray    jboolean

GetByteArrayRegion()    jbyteArray    jbyte

GetCharArrayRegion()    jcharArray    jchar

GetShortArrayRegion()    jshortArray    jhort

GetIntArrayRegion()    jintArray    jint

GetLongArrayRegion()    jlongArray    jlong

GetFloatArrayRegion()    jfloatArray    jloat

GetDoubleArrayRegion()    jdoubleArray    jdouble

参数:

env:JNI 接口指针。

array:Java 指针。

start:起始下标。

len:要复制的元素数。

buf:目的缓冲区。

抛出:

ArrayIndexOutOfBoundsException:如果区域中的某个下标无效。

SetArrayRegion 例程  

void   SetArrayRegion(JNIEnv *env, ArrayType array,  jsize start, jsize len, NativeType *buf);        

将基本类型数组的某一区域从缓冲区中复制回来的一组函数。

下表说明了特定的基本类型数组元素访问器。应进行如下替换:

将 SetArrayRegion 替换为表中的实际基本类型元素访问器例程名。

将 ArrayType 替换为对应的数组类型。

将 NativeType 替换为该例程对应的本地类型。

表 4-13 SetArrayRegion 数组访问器例程系列

SetArrayRegion 例程    数组类型    本地类型

SetBooleanArrayRegion()    jbooleanArray    jboolean

SetByteArrayRegion()    jbyteArray    jbyte

SetCharArrayRegion()    jcharArray    jchar

SetShortArrayRegion()    jshortArray    jshort

SetIntArrayRegion()    jintArray    jint

SetLongArrayRegion()    jlongArray    jlong

SetFloatArrayRegion()    jfloatArray    jfloat

SetDoubleArrayRegion()    jdoubleArray    jdouble

参数:

env:JNI 接口指针。

array:  Java 数组。

start:起始下标。

len:要复制的元素数。

buf:源缓冲区。

抛出:

ArrayIndexOutOfBoundsException:如果区域中的某个下标无效。

注册本地方法

RegisterNatives   

jint   RegisterNatives(JNIEnv *env, jclass clazz,   const JNINativeMethod *methods, jint nMethods);        

向 clazz 参 数指定的类注册本地方法。methods 参数将指定 JNINativeMethod 结构的数组,其中包含本地方法的名称、签名和函数指针。 nMethods 参数将指定数组中的本地方法数。JNINativeMethod 结构定义如下所示:

typedef struct {

char *name;

char *signature;

void *fnPtr;

} JNINativeMethod;

函数指针通常必须有下列签名:

ReturnType (*fnPtr)(JNIEnv *env, jobject objectOrClass, ...);

参数:

env:JNI 接口指针。

clazz:Java 类对象。

methods:类中的本地方法。

nMethods:类中的本地方法数。

返回值:

成功时返回 "0";失败时返回负数。

抛出:

NoSuchMethodError:如果找不到指定的方法或方法不是本地方法。

UnregisterNatives   

jint   UnregisterNatives(JNIEnv *env, jclass clazz);        

取消注册类的本地方法。类将返回到链接或注册了本地方法函数前的状态。

该函数不应在常规平台相关代码中使用。相反,它可以为某些程序提供一种重新加载和重新链接本地库的途径。

参数:

env:JNI 接口指针。

clazz:Java 类对象。

返回值:

成功时返回“0”;失败时返回负数。

访问对象的域

GetFieldID   

jfieldID   GetFieldID(JNIEnv *env, jclass clazz,   const char *name, const char *sig);        

返回类的实例(非静态)域的域 ID。该域由其名称及签名指定。访问器函数的GetField 及 SetField 系列使用域 ID 检索对象域。

GetFieldID() 将未初始化的类初始化。

GetFieldID() 不能用于获取数组的长度域。应使用GetArrayLength()。

参数:

env:JNI 接口指针。

clazz:Java 类对象。

name:0 终结的 UTF-8 字符串中的域名。

sig:0 终结的 UTF-8 字符串中的域签名。

返回值:

域 ID。如果操作失败,则返回NULL。

抛出:

NoSuchFieldError:如果找不到指定的域。

ExceptionInInitializerError:如果由于异常而导致类初始化程序失败。

OutOfMemoryError:如果系统内存不足。

GetField 例程     

NativeType   GetField(JNIEnv*env, jobject obj, jfieldID fieldID);        

该访问器例程系列返回对象的实例(非静态)域的值。要访问的域由通过调用GetFieldID() 而得到的域 ID 指定。

下 表说明了 GetField 例程名及结果类型。应将 GetField 中的 type 替换为域 的 Java 类型(或使用表中的某个实际例程名),然后将NativeType 替换为该例程对应的本地类型。

表 4-1 GetField 访问器例程系列

GetField 例程名    本地类型

GetObjectField()    jobject

GetBooleanField()    jboolean

GetByteField()    jbyte

GetCharField()    jchar

GetShortField()    jshort

GetIntField()    jint

GetLongField()    jlong

GetFloatField()    jfloat

GetDoubleField()    jdouble

参数:

env:JNI 接口指针。

obj:Java 对象(不能为 NULL)。

fieldID:有效的域 ID。

返回值:

域的内容。

SetField 例程  

void   SetField(JNIEnv *env, jobject obj, jfieldID fieldID,   NativeType value);       

该访问器例程系列设置对象的实例(非静态)域的值。要访问的域由通过调用SetFieldID() 而得到的域 ID 指定。

下 表说明了 SetField 例程名及结果类型。应将 SetField 中的 type 替换为域 的 Java 类型(或使用表中的某个实际例程名),然后将NativeType 替换为该例程对应的本地类型。

表4-2 SetField 访问器例程系列

SetField 例程名    本地类型

SetObjectField()    jobject

SetBooleanField()    jboolean

SetByteField()    jbyte

SetCharField()    jchar

SetShortField()    jshort

SetIntField()    jint

SetLongField()    jlong

SetFloatField()    jfloat

SetDoubleField()    jdouble

参数:

env:JNI 接口指针。

obj:Java 对象(不能为 NULL)。

fieldID:有效的域 ID。

value:域的新值。

时间: 2024-10-23 14:13:58

C/C++调用java---JNI常用函数的相关文章

java基础--常用函数总结

java基础--常用函数总结 2019-3-16-23:28:01-----云林原创 1.split()字符串分割函数 将一个字符串分割为子字符串,然后将结果作为字符串数组返回. 2.Math.floor( )舍掉小数取整数 3.Math.rint( )四舍五入取整数 4.Math.ceil( )进位取整数 5.IndexOf( )查找特定字符出现的索引 ----------------------------------------->特定字符出现的最先出现的位置:IndexOf(): ---

不用static,巧用对象.方法调用java中的函数

先生成一个对象,用"对象.方法()"的方式调用. java中的main方法是静态的,用于程序的入口,在静态方法中无法调用非静态方法,只能调用静态方法.想调用静态方法的话就要先生成该类的一个对象,通过对象调用非静态方法.如:public class SquareIntTest { public static void main(String[] args) {  int result;  SquareIntTest m = new SquareIntTest();  for (int x

Java String常用函数

String 1. char charAt(int index) :取字符串中的某一个字符,其中的参数index指的是字符串中序数.字符串的序数从0开始到length()-1 . 2. int compareTo(String anotherString) :当前String对象与anotherString比较.相等关系返回0:不相等时,从两个字符串第0个字符开始比较,返回第一个不相等的字符差,另一种情况,较长字符串的前面部分恰巧是较短的字符串,返回它们的长度差. 4. String conca

【转】JNI学习积累之一 ---- 常用函数大全

原文网址:http://blog.csdn.net/qinjuning/article/details/7595104 本文原创,转载请注明出处:http://blog.csdn.net/qinjuning 最近一段时间,在工作方面比较闲,分配的Bug不是很多,于是好好利用这段时间就着源代码看了些许模块, 主要方式 还是贼看贼看代码, 同时利用烧机的便利,加Log观看,基本上都能弄个脸熟 .心里想着该写点什么了?可是水平不够,再加上 包括很多真正实现地方--中间层,基本上没看.于是乎,也就不好卖

[转载]JNI学习积累之一 ---- 常用函数大全

本文转载于:http://blog.csdn.net/qinjuning 最近一段时间,在工作方面比较闲,分配的Bug不是很多,于是好好利用这段时间就着源代码看了些许模块, 主要方式 还是贼看贼看代码, 同时利用烧机的便利,加Log观看,基本上都能弄个脸熟 .心里想着该写点什么了?可是水平不够,再加上 包括很多真正实现地方--中间层,基本上没看.于是乎,也就不好卖弄了. 花了几天时间研究了下JNI,基本上知道如何使用了.照我的观点JNI还是不难的,难得只是我们一份尝试的心. 学习过程中, 发现关

51CTO下载-python调用java.docx

链接: http://blog.csdn.net/jobjava/article/details/7280798 python调用Java: JPype使用介绍 Python 作为一种灵活的软件开发语言在当今被广泛使用.在软件开发过程中,有时需要在 Python 项目中利用既有的 Java 代码,已达到节省时间和开发成本的目的.因此,找到一个 Python 代码调用 Java 代码的桥梁是非常有意义的. JPype 就是这样的一个工具,利用它可以使 Python 程序方便的调用 Java 代码,

Oracle触发器反向调用Java程序

导入jar包 在oracle中导入需要的jar包,我们把编辑好的java类打成jar包,直接在oarcle里面写简单的调用就可以了, 1.操作系统需要拥有支持loadjava命令的jdk. 2.加载jlha.jar包,到oracle数据库中. 操作过程:在dos环境下,输入命令: loadjava -r -f -o -user usscares/[email protected] jlha.jar 注意:jar包要在1.4的环境下编译,项目右键 properties java compiler

转:Delphi10.3 中通过JNI调用 Java 函数

现在很多SDK都提供了JAVA接口.但是没有Delphi接口. 没有办法只好曲线救国.我们可以通过 JNI 的方式在 Delphi10.3 中调用 Java 的函数. 第一步:创建 Java 虚拟机和运行环境 procedure TForm1.FormCreate(Sender: TObject);var Options: array [0 .. 4] of JavaVMOption; VM_args: JavaVMInitArgs; ErrCode: Integer;begin { 创建 Ja

jni中调用java方法获取当前apk的签名文件md5值

相应的java方法: void getsign(Context context) throws Exception { PackageInfo localPackageInfo = context.getPackageManager() .getPackageInfo(context.getPackageName(), 64); StringBuilder localStringBuilder = new StringBuilder(); Signature[] arrayOfSignature

ndk学习18: JNI之C&C++调用Java

一.Java反射机制 先了解Java反射机制原理 例子网上很多,反射很灵活 二. 在JNI层调Java 用途: Java层逆向比较容易,增加逆向门槛,把调用都写到JNI层,  让Java层无调用关系 注意: C和C++有所不同,这里使用C++作为例子 1. 首先在代码中提供一个ShowLog函数 private void ShowMsg() { Log.d("_BING_", "ShowMsg"); } 2. 在上次的Add例子加入代码 JNIEXPORT jint