最近有个功能用到了JNI,于是就开始拆腾JNI。有些感悟,分享一下。
通过JNI本身代码来调用native代码感觉上有点绕。也就是说你必须按照流程来做。
1)声明native方法,在你要调用JNI的类,假定命名为example.java
2)通过javah example.java生成C++的头文件。
3)通过在C++代码里面添加此头文件,并实现native方法。
这样下来就能够在java中调用到这你所实现的native方法,可以得出一个观点,如果你需要通过java调用其它语言的写的native方法,先应该先实现用C++对这种语言的调用,再集成到java。C++充当一个适配器的角色。
如果你不想用JNI写这些繁琐的过程,你也可以通过另外一个framework来实现,比如JNative, 对比JNI直接写的话,这种方式来的比较直观和简便。俗话说“简单才是王道”,在调用不是很复杂的情况下,推荐用它来实现native的调用,比如调用一个windows系统dll(user32.dll)。如果情况比较复杂,那么我们还是得用JNI来做,本人碰到的一个对delphi的dll调用的问题,内部接口的参数是一个窗口句柄,而且不能是默认的桌面句柄(Zero)。在使用JNative的时候就一直过不去。报的错误也是蛮莫名其妙的。此功能调用如果用C#的话很简单,传入new出来的窗口句柄就能够成功调用。所以我想应该是句柄参数的问题。
这样的话你就得通过JNI调用C++的方式来实现对delphi的dll调用。由于要用C++编码,本人还没来得急尝试,不过理论上是可以的,以后有空的话尝试完再补上代码:)