Java类需要在虚拟机上运行,也就不是原生的,同样.NET Framework也不是原生的。JNI也就是Java原生接口。关于JNI的规范,以及为什么要使用它,它能做些什么,都在http://java.sun.com/j2se/1.4.2/docs/guide/jni/spec/jniTOC.html里记述着。
JNI是规范,它规定了虚拟机的接口,而把具体的实现留给开发者。
JVM的实现不是唯一的,目前存在很多种Java虚拟机,Sun Hotspot,IBM JDK,还有HP的,Kaffe等等。最流行的就是Sun的Hotspot,最复杂的就是IBM JDK,这是IBM的一贯作风。本文不讨论JVM的实现,只关注JNI。如果您安装了Sun的JDK,您就能在[JAVA_HOME]/include目录下找到jni.h。这个头文件就是虚拟机的唯一接口,你可以调用它声明的函数创建一个JVM。
在说明C++调用Java类之前,我想先演示一下如果编写Java Native Method。
1.编写带有Native方法的Java类
- org.colimas.jni.test;
- public class JniTest{
- static { System.loadLibrary("JniTestImpl"); } //JVM调用JniTestImpl.dll
- public JniTest(){
- }
- //原生方法
- public native void print(String str);
- /** *//**
- * @param args
- */
- public static void main(String[] args){
- JniTest test=new JniTest();
- test.print("hello JVM"); //调用原生方法
- }
- }
org.colimas.jni.test; public class JniTest{ static { System.loadLibrary("JniTestImpl"); } //JVM调用JniTestImpl.dll public JniTest(){ } //原生方法 public native void print(String str); /** *//** * @param args */ public static void main(String[] args){ JniTest test=new JniTest(); test.print("hello JVM"); //调用原生方法 } }
2.使用javah生成c语言头文件。
javah -jni org.colimas.jni.test.JniTest
目录里多了一个org_colimas_jni_test_JniTest.h文件,打开文件,内容如下:
- * DO NOT EDIT THIS FILE - it is machine generated */
- #include <jni.h>
- /**//* Header for class org_colimas_jni_test_JniTest */
- #ifndef _Included_org_colimas_jni_test_JniTest
- #define _Included_org_colimas_jni_test_JniTest
- #ifdef __cplusplus
- extern "C" {
- #endif
- /**//*
- * Class: org_colimas_jni_test_JniTest
- * Method: print
- * Signature: (Ljava/lang/String;)V
- */
- JNIEXPORT void JNICALL Java_org_colimas_jni_test_JniTest_print
- (JNIEnv *, jobject, jstring);
- #ifdef __cplusplus
- }
- #endif
- #endif