整个网上就没看到一个关于JNI好点的文档,干脆自己写一份,以方便以后使用的时候查阅

1. 类操作

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 类。

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

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

2. 异常

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:错误消息。

3. 全局及局部引用

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:局部引用。

4. 实例化对象的操作

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() 获得,且调用时的方法名必须为 <init>,而返回类型必须为 void (V)。

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

三个函数的区别在于,调用构造函数时传递参数的方法不同。NewObject是直接放在methodID后面,NewObjectA是放在args的数组里面,NewObjectV是放在参数为va_list的args里面,其他都一样。

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

jboolean  IsSameObject(JNIEnv *env, jobject ref1, jobject ref2);         

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

参数:          

env:JNI 接口指针。

ref1:Java 对象。

ref2:Java 对象。

返回值:             

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

5. 调用实例化对象里的方法

GetMethodID

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

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

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

要获得构造函数的方法 ID,应将 <init> 作为方法名,签名:如果无参:"()V"。   如果带一个整型参数:"()I"

        

参数:          

env:JNI 接口指针。

clazz:Java 类对象。

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

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

返回值:             

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

抛出:          

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

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

OutOfMemoryError:如果系统内存不足。

Call< type >Method、Call< type >MethodA、Call< type >MethodV

NativeType   Call<type>Method(JNIEnv*env, jobject obj, jmethodID methodID, ...);          

NativeType  Call<type>MethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args);         

NativeType  Call<type>MethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args);  

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

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

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

Call<type>Method例程

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

Call<type>MethodA 例程

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

Call<type>MethodV例程

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

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

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

参数:          

env:JNI 接口指针。

obj:Java 对象。

methodID:方法 ID。

Call<type>Method例程的其它参数:

要传给 Java 方法的参数。

Call<type>MethodA例程的其它参数:

args:参数数组。

Call<type>MethodV例程的其它参数:

args:参数的 va_list。

返回值:             

返回调用 Java 方法的结果。

抛出:          

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

6. 字符串操作

JNI支持Unicode/UTF-8字符编码互转。Unicode以16-bits值编码;UTF-8是一种以字节为单位变长格式的字符编码,并与7-bitsASCII码兼容。UTF-8字串与C字串一样,以NULL('\0')做结束符, 当UTF-8包含非ASCII码字符时,以'\0'做结束符的规则不变。7-bit ASCII字符的取值范围在1-127之间,这些字符的值域与UTF-8中相同。当最高位被设置时,表示多字节编码。

NewString(Unicode编码)

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(UTF-8编码)

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 字符串的指针。

7. 数组操作(基本类型数组、对象类型数组)

GetArrayLength

jsize  GetArrayLength(JNIEnv *env, jarray array);          

返回数组中的元素数。

参数:          

env:JNI 接口指针。

array:Java 数组对象。

返回值:             

数组的长度。

下面是对象类型数组(String之类的):

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 的类不是数组元素类的子类。

下面是基本类型数组(jchar/jint之类的):

New< PrimitiveType >Array

ArrayType  New<PrimitiveType>Array(JNIEnv*env, jsize length);         

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

 表 4-8 New<PrimitiveType>Array 数组构造函数系列 

参数:          

env:JNI 接口指针。

length:数组长度。

返回值:             

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

Get< PrimitiveType >ArrayElements:(拿到数组:jintArray-->jint*)

NativeType  *Get<PrimitiveType>ArrayElements(JNIEnv *env, ArrayType array, jboolean*isCopy);          

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

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

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

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

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

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

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

 表4-9 Get<PrimitiveType>ArrayElements 访问器例程系列

参数:          

env:JNI 接口指针。

array:Java 字符串对象。

isCopy:指向布尔值的指针。

返回值:             

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

Release< PrimitiveType >ArrayElements

void   Release<PrimitiveType>ArrayElements(JNIEnv *env, ArrayType array, NativeType *elems, jintmode);             

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

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

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

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

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

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

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

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

 

 表 4-11 Release<PrimitiveType>ArrayElements 数组例程系列

参数:          

env:JNI 接口指针。

array:Java 数组对象。

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

mode:释放模式。

Get< PrimitiveType >ArrayRegion

void    Get<PrimitiveType>ArrayRegion(JNIEnv *env, ArrayType array, jsize start, jsize len, NativeType *buf);       

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

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

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

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

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

表 4-12 Get<PrimitiveType>ArrayRegion 数组访问器例程系列

参数:          

env:JNI 接口指针。

array:Java 指针。

start:起始下标。

len:要复制的元素数。

buf:目的缓冲区。

抛出:          

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

Set< PrimitiveType >ArrayRegion

void   Set<PrimitiveType>ArrayRegion(JNIEnv *env, ArrayType array,  jsize start, jsize len, NativeType *buf);       

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

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

将 Set<PrimitiveType>ArrayRegion 替换为表中的实际基本类型元素访问器例程名。

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

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

 表 4-13 Set<PrimitiveType>ArrayRegion 数组访问器例程系列

参数:          

env:JNI 接口指针。

array:  Java 数组。

start:起始下标。

len:要复制的元素数。

buf:源缓冲区。

抛出:          

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

8. 注册本地方法

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”;失败时返回负数。

9. 访问对象的域(也就是查看修改对象里面的属性,或者说变量)

GetFieldID

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

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

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

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

参数:          

env:JNI 接口指针。

clazz:Java 类对象。

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

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

返回值:             

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

抛出:          

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

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

OutOfMemoryError:如果系统内存不足。

Get< type >Field

NativeType   Get<type>Field(JNIEnv*env, jobject obj, jfieldID fieldID);             

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

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

 表 4-1 Get<type>Field 访问器例程系列

参数:          

env:JNI 接口指针。

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

fieldID:有效的域 ID。

返回值:             

域的内容。

Set< type >Field

void   Set<type>Field(JNIEnv *env, jobject obj, jfieldID fieldID, NativeType value);       

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

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

 

 表4-2 Set<type>Field 访问器例程系列

参数:          

env:JNI 接口指针。

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

fieldID:有效的域 ID。

value:域的新值。

(二)JNI方法总结的更多相关文章

  1. Java Native Interface 二 JNI中对Java基本类型和引用类型的处理

    本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 Java编程里会使用到两种类型:基本类型(如 ...

  2. 技术转载:Jni学习四:如何编写jni方法

    转载:http://blog.chinaunix.net/u1/38994/showart_1099528.html 一.概述: 在这篇文章中将会简单介绍如何编制一些简单的JNI 方法.我们都知道JN ...

  3. 在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口(老罗学习笔记4)

    在上两篇文章中,我们介绍了如何为Android系统的硬件编写驱动程序,包括如何在Linux内核空间实现内核驱动程序和在用户空间实现硬件抽象层接口.实现这两者的目的是为了向更上一层提供硬件访问接口,即为 ...

  4. 为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口

    在上两篇文章中,我们介绍了如何为Android系统的硬件编写驱动程序,包括如何在Linux内核空间实现内核驱动程序和在用户空间实现硬件抽象层接 口.实现这两者的目的是为了向更上一层提供硬件访问接口,即 ...

  5. mysql 远程连接数据库的二种方法

    http://blog.csdn.net/freecodetor/article/details/5799550 一.连接远程数据库: 1.显示密码 如:MySQL 连接远程数据库(192.168.5 ...

  6. IIS7.5使用web.config设置伪静态的二种方法

    转自 网上赚钱自学网 .http://www.whosmall.com/post/121 近几天公司里开发的项目有几个运行在IIS7.5上,由于全站采用的是伪静态,因此从网上找到两两种方法来实现.这两 ...

  7. Java Native Interface 五 JNI里的多线程与JNI方法的注册

    本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 JNI里的多线程 在本地方法里写有关多线程的 ...

  8. Dalvik虚拟机JNI方法的注册过程分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8923483 在前面一文中,我们分析了Dalvi ...

  9. Android有关JNI 学习(两)为JNI方法名称,数据类型和方法签名的一些知识

    我们知道,使用javah产生c/c++当在头文件,将java定义 native 功能,以产生相应jni层功能,如下面: /* * Class: com_lms_jni_JniTest * Method ...

  10. mysql 远程连接数据库的二种方法

    一.连接远程数据库: 1.显示密码 如:MySQL 连接远程数据库(192.168.5.116),端口"3306",用户名为"root",密码"123 ...

随机推荐

  1. centos7 二进制安装mysql5.6

    下载mysqltar包 wget -q http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.35-linux-glibc2.5-x86_64.tar.g ...

  2. AI下载步骤

    ai下载地址:https://www.adobe.com/cn/creativecloud/catalog/desktop.html?promoid=PTYTQ77P&mv=other 破解器 ...

  3. 多个音频audio2

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. centos绑定https

    1.百度云申请免费ssl证书 一年一申请 2. https://www.wosign .com /faq/faq-apache-https.htm 3.注意ssl.conf里面各个证书的顺序 证书路径 ...

  5. Python str转化成数字

    原地址 http://www.cnblogs.com/wuxiangli/p/6046800.html   int(x [,base ])         将x转换为一个整数     long(x [ ...

  6. 如何在CentOS 7安装Node.js

    最近,我一直对学习Node.js比较感兴趣.这是一个Java平台的服务器端编程 ,它允许开发人员在服务器编写Java代码,并且有许多CentOS的用户正努力学习这个语言的开发环境.这正是我想做这个教程 ...

  7. 主机:Think Pad(6475EC7) 64位的Win7上面装CentOS,说VT模式没有被启动,但BIOS里面已经启用了VT-X

    我的主机是ThindPad,型号是6475EC7,就是比较老的型号. 启动vmware出现 二进制转换与此平台长模式不兼容.......: 首先:进入BOIS查看VT是否已经开启(不同型号电脑VT选项 ...

  8. delphi 10.2 ---treeview 基本用法

    unit Unit2; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System ...

  9. J2SE基本安装和java的环境变量

    J2SE基本安装和java的环境变量   1. 首先登录http://www.oracle.com,下载JDK(J2SE) JDK有很多版本其中JDK 1.0,1.1,1.2,1.3,1.4 1.5 ...

  10. FlowPortal-BPM——移动手机端配置与IIS发布

    一.移动手机端配置 (1)VS打开文件夹iAnyWhere,配置config文件 (2)BPM-Web文件config中设置(设置为外网网址) 二.BPM设置 勾选移动审批可以设置要展示的字段信息,修 ...