|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
先谈谈我对java的一些认识。我选择java,是因为他语法简单,功能强大,从web,到桌面,到嵌入式,无所不能。但当我进一步了解了java后,感叹,java原来也有许多缺点。
使用JNI函数,程序员可从一个固无方法的外部与JVM打交道。正如人人在后面的例子中看到的那样,每一个JNI固无方法城市吸收一个特别的自变量作为本人的第一个参数:JNIEnv自变量——它是指向范例为JNIEnv_的一个特别JNI数据布局的指针。JNI数据布局的一个元素是指向由JVM天生的一个数组的指针;该数组的每一个元素都是指向一个JNI函数的指针。可从固无方法的外部收回对JNI函数的挪用,做法是取消对这些指针的援用(详细的操纵实践很复杂)。每种JVM都以本人的体例完成了JNI函数,但它们的地点一定位于事后界说好的偏移处。
使用JNIEnv自变量,程序员可会见一系列函数。这些函数可分别为下述种别:
■猎取版本信息
■举行类和对象操纵
■把持对Java对象的全局和部分援用
■会见实例字段和静态字段
■挪用实例办法和静态办法
■实行字串和数组操纵
■发生和把持Java非常
JNI函数的数目相称多,这里不再胪陈。相反,我会向人人展现利用这些函数时面前的一些基础道理。欲懂得更具体的情形,请参阅本人所用编译器的JNI文档。
若察看一下jni.h头文件,就会发明在#ifdef_cplusplus预处置器前提的外部,当由C++编译器编译时,JNIEnv_布局被界说成一个类。这个类包括了大批内嵌函数。经由过程一种复杂并且熟习的语法,这些函数让我们能够沉着会见JNI函数。比方,前例包括了上面这行代码:
(*jEnv)->ReleaseStringUTFChars(jEnv,jMsg,msg);
它在C++里可改写成上面这个模样:
jEnv->ReleaseStringUTFChars(jMsg,msg);
人人可注重到本人不再必要同时取消对jEnv的两个援用,不异的指针不再作为第一个参数传送给JNI函数挪用。在这些例子剩下的中央,我会利用C++作风的代码。
1.会见Java字串
作为会见JNI函数的一个例子,请思索上述的代码。在这里,我们使用JNIEnv的自变量jEnv来会见一个Java字串。Java字串接纳的是Unicode格局,以是倘使收到如许一个字串,并想把它传给一个非Unicode函数(如printf()),起首必需用JNI函数GetStringUTFChars()将其转换成ASCII字符。该函数能吸收一个Java字串,然后把它转换成UTF-8字符(用8位宽度包容ASCII值,或用16位宽度包容Unicode;若原始字串的内容完整由ASCII组成,那末了局字串也是ASCII)。
GetStringUTFChars是JNIEnv直接指向的谁人布局里的一个字段,而这个字段又是指向一个函数的指针。为会见JNI函数,我们用传统的C语法来挪用一个函数(经由过程指针)。使用上述情势可完成对一切JNI函数的会见。
java也能做一些底层语言开发做的事情(难度很高,不是java顶尖高手是做不来的), |
|