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类

Java代码 JNI之C++调用Java类 _Java JNI之C++调用Java类 _Java_02
  1. org.colimas.jni.test;
  2.  
  3. public class JniTest{
  4.  
  5. static { System.loadLibrary("JniTestImpl"); } //JVM调用JniTestImpl.dll
  6.  
  7. public JniTest(){
  8. }
  9.  
  10. //原生方法
  11. public native void print(String str);
  12.  
  13. /** *//**
  14. * @param args
  15. */
  16. public static void main(String[] args){
  17. JniTest test=new JniTest();
  18. test.print("hello JVM"); //调用原生方法
  19. }
  20. }


2.使用javah生成c语言头文件。
javah -jni org.colimas.jni.test.JniTest

目录里多了一个org_colimas_jni_test_JniTest.h文件,打开文件,内容如下:

Java代码 JNI之C++调用Java类 _Java JNI之C++调用Java类 _Java_02
  1. * DO NOT EDIT THIS FILE - it is machine generated */
  2.  
  3. #include <jni.h>
  4.  
  5. /**//* Header for class org_colimas_jni_test_JniTest */
  6.  
  7.  
  8. #ifndef _Included_org_colimas_jni_test_JniTest
  9. #define _Included_org_colimas_jni_test_JniTest
  10. #ifdef __cplusplus
  11.  
  12. extern "C" {
  13.  
  14. #endif
  15.  
  16. /**//*
  17. * Class: org_colimas_jni_test_JniTest
  18. * Method: print
  19. * Signature: (Ljava/lang/String;)V
  20. */
  21.  
  22. JNIEXPORT void JNICALL Java_org_colimas_jni_test_JniTest_print
  23. (JNIEnv *, jobject, jstring);
  24.  
  25. #ifdef __cplusplus
  26. }
  27.  
  28. #endif
  29. #endif