作者AmosYang (LetMeGoogleThatForYou)
看板java
标题Re: [闲聊] 魔法 JNI
时间Fri Apr 30 07:42:46 2010
※ 引述《sbrhsieh (偶尔想摆烂一下)》之铭言:
: 这一篇不是要介绍 JNI 的观念。
: 有兴趣的人可以把本文当作轶事看。
: 没有兴趣的人可以当作新闻看。
: 完全不懂 JNI,以後也完全不会/想用到 JNI 者,就可以离开不看。
要闲聊的话我也要参一脚…
我第一次实际接触到 JNI 是刚开始摸 Java 时,
抱着 java.lang.System 的 javadoc 在读, 读着读着就觉得奇妙…
这个天天在用的 System.out... 是个 public static
field
由於不能改变这个 field 的值,可见得应该是宣告成 final
但又有这个奇妙的 method
static void setOut(PrintStream out)
Reassigns the "standard" output stream.
至此百思不得其解…只好把 java.lang.System 的原始码挖出来看
里面果然是长这个样子
public final static PrintStream out = nullPrintStream();
再追下去就看到了
private static
native void setOut0(PrintStream out);
才知道有 JNI 这东西…
最後顺藤摸瓜就爬到了这本圣经
http://java.sun.com/docs/books/jni/html/jniTOC.html
第十章,每个用 JNI 的人都应该要读三遍
http://java.sun.com/docs/books/jni/html/pitfalls.html
JNI 的行为对来自於 C/C++ 世界的人来说没什麽奇怪的
C/C++ 里的魔术已经够多了 XD
但就如同 sbrhsieh 所说的,对纯 Java 人来说,
JNI的行为的确跟 black magic/voodoo 差不多 :D
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 65.87.177.87
※ 编辑: AmosYang 来自: 65.87.177.87 (04/30 07:52)
1F:推 costbook:这种好东西竟然开放下载耶,感谢分享 04/30 08:30
2F:推 zanyking:C#里就很直接的给你unsafe区块,等於是挖个窗口直接做 04/30 09:53
3F:推 james732:感谢分享 很棒的资料!! 04/30 10:30
4F:→ sbrhsieh:实际上JVM本身就没有enforce final field 的不变性质在.. 04/30 15:43
5F:→ sbrhsieh:定义该 field 的 class 内。 04/30 15:44
6F:→ sbrhsieh:final field setter method 可以在 bytecode level 实现 04/30 15:46
7F:推 kuninaka:跟我一样 不过我是去找数学函式XDD 04/30 20:09