JNI学习笔记
1、Java中装载dll库
System.loadLibrary(String);
?
本地方法
jint JNI_OnLoad(JavaVM* vm, void* reserved);(返回所需的JVM最低版本,如JNI_VERSION_1_2)
void JNI_OnUnload(JavaVM* vm, void* reserved);
?
2、基本数据类型对照
Java???????????? ?C??????????????? 字节
boolean??????? jboolean???? 1
byte????????????? jbyte????????? 1
char????????????? jchar?????????? 2
short???????????? jshort???????? 2
int???????????????? jint????????????? 4
long????????????? jlong?????????? 8
float????????????? jfloat?????????? 4
double????????? jdouble??????? 8
?
JNI_FALSE = 0
JNI_TRUE = 1
?
3、字符串参数
jstring NewStringUTF(JNIEnv* env, const char bytes[]);
以全0字节结尾的“改良UTF-8”字节序列,返回一个新的Java字符串对象,或NULL
?
jsize GetStringUTFLength(JNIEnv* env, jstring string);
返回进行UTF-8编码所需的字节个数。(不计算作为终止符的全0字节)
?
const jbyte* GetStringUTFChars(JNIEnv* env, jstring string, jboolean* isCopy);
返回“改良UTF-8”编码的字符串的指针,或者当不能构建字符数组时返回NULL。直到ReleaseStringUTFChars函数调用前,该指针一直有效。isCopy如果进行了复制,则填入JNI_TRUE,否则填入JNI_FALSE。
?
void ReleaseStringUTFChars(JNIEnv* env, jstring string, const jbyte bytes[]);
通知虚拟机本地代码不再需要通过bytes访问Java字符串
?
void GetStringRegion(JNIEnv* env, jstring string, jsize start, jsize length, jchar *buffer);
将一个UTF-16双字节序列从字符串复制到用户提供的缓存中。缓存必须足够长,最坏情况下,要复制3*length个字节。
?
void GetStringUTFRegion(JNIEnv* env, jstring string, jsize start, jsize length, jchar *buffer);
将一个“改良UTF-8”字符序列从字符串复制到用户提供的缓存中。缓存必须足够长,最坏情况下,要复制3*length个字节。
?
jstring NewString(JNIEnv* env, const jchar chars[], jsize length);
根据Unicode字符串返回一个新的Java字符串对象,或NULL
env???????? JNI接口指针
chars????? 以null结尾的UTF-16字符串
length??? 字符串中字符的个数
?
jsize GetStringLength(JNIEnv* env, jstring string);
返回字符串中字符的个数
?
const jchar* GetStringChars(JNIEnv* env, jstring string, jboolean* isCopy);
返回Unicode编码的字符串指针,或NULL。直到ReleaseStringChars函数调用前,该指针一直有效。isCopy如果进行了复制,则填入JNI_TRUE,否则填入JNI_FALSE。
?
void ReleaseStringChars(JNIEnv* env, jstring string, const jchar chars[]);
通知虚拟机本地代码不再需要通过bytes访问Java字符串
?
4、访问域
jfieldID GetFieldID(JNIEnv *env, jclass cl, const char name[], const char fieldSignature[]);
返回类中一个域的标识符。fieldSignature 编码签名(见5)
?
Xxx GetXxxField(JNIEnv *env, jobject obj, jfieldID id);
返回域的值。域类型Xxx是Object、Boolean、Byte、Char、Short、Int、Long、Float、或Double之一
?
void SetXxxField(JNIEnv *env, jobject obj, jfieldID id, Xxx value);
把某个域设置为一个新值。域类型Xxx是Object、Boolean、Byte、Char、Short、Int、Long、Float、或Double之一
?
jfieldId GetStaticFieldID(JNIEnv *env, jclass cl , const char name[] , const char fieldsignature[]);
返回某类型的一个静态域的标识符。fieldSignature 编码签名(见5)
?
Xxx GetStaticXxxField(JNIEnv *env, jclass cl , jfieldID id);
返回某静态域的值
?
void SetStaticXxxField(JNIEnv *env, jclass cl , jfieldID id , Xxx value);
把某个静态域设置为一个新值
?
5、编码签名
签名???????????????????????? 类型
B???????????????????????????? byte
C???????????????????????????? char
D???????????????????????????? double
F???????????????????????????? float
I????????????????????????????? int
J????????????????????????????? long
S???????????????????????????? short
V???????????????????????????? void
Z?????????????????????????????boolean
[????????????????????????????? 数组
?
例:字符串数组? ->? [Ljava/lang/String;
????? float[][]???? ->? [[F
?
完整方法签名: (参数类型...)返回值类型
例:接收两个整型参数并返回一个整型参数的方法编码??? ->??? (II)I
例:void print(String s)???????????????????????????????????????? ->??? (Ljava/lang/String;)V
例:Employee(java.lang.String, double, java.util.Date)??? ->?? (Ljava/lang/String;DLjava/util/Date;)V
?
查看类的方法签名:javap -s -private Employee