怎样在JAVA里嵌入C/C++代码

来源:互联网 发布:初级数据分析师内容 编辑:程序博客网 时间:2024/04/29 09:26

Java Native InterfaceJNIJava语言的本地编程接口,是J2SDK的一部分。在java程序中,我们可以通过JNI实现一些用java语言不便实现的功能。通常有以下几种情况我们需要使用JNI来实现。

l   标准的java类库没有提供你的应用程序所需要的功能,通常这些功能是平台相关的

l   你希望使用一些已经有的类库或者应用程序,而他们并非用java语言编写的

l   程序的某些部分对速度要求比较苛刻,你选择用汇编或者c语言来实现并在java语言中调用他们

 

  1.编写HelloWorld程序,由于涉及到要编写c/c++代码因此我们会在开发中使用Microsoft   VC++工具。编写java代码,我们在硬盘上建立一个hello目录作为我们的工作目录,首先我们需要编写自己的java代码,在java代码中我们会声明native方法,代码非常简单。如下所示  
  class   HelloWorld   {  
          public   native   void   displayHelloWorld();  
          static   {  
                  System.loadLibrary("hello");  
          }  
           
          public   static   void   main(String[]   args)   {  
                  new   HelloWorld().displayHelloWorld();  
          }  
  }  
 
注意我们的displayHelloWorld()方法的声明,它有一个关键字native,表明这个方法使用java以外的语言实现。方法不包括实现,因为我们要用c/c++语言实现它。注意System.loadLibrary("hello")这句代码,它是在静态初始化块中定义的,系统用来装载hello共享库,这就是我们在后面生成的hello.dll(如果在其他的操作系统可能是其他的形式,比如hello.so    
 2
。编译java代码  
  javac   HelloWorld.java    
生成HelloWorld.class文件    
3
。创建.h文件  
 
这一步中我们要使用javah命令生成.h文件,这个文件要在后面的c/c++代码中用到,我们运行  
  javah   HelloWorld
。这样我们可以看到在相同目录下生成了一个HelloWorld.h文件,文件内容如下  
 
在此我们不对他进行太多的解释。  
  /*   DO   NOT   EDIT   THIS   FILE   -   it   is   machine   generated   */  
  #include   <jni.h>  
  /*   Header   for   class   HelloWorld   */  
  #ifndef   _Included_HelloWorld  
  #define   _Included_HelloWorld  
  #ifdef   __cplusplus  
  extern   "C"   {  
  #endif  
  /*  
    *   Class:           HelloWorld  
    *   Method:         displayHelloWorld  
    *   Signature:   ()V  
    */  
  JNIEXPORT   void   JNICALL   Java_HelloWorld_displayHelloWorld  
      (JNIEnv   *,   jobject);  
  #ifdef   __cplusplus  
  }  
  #endif  
  #endif    
 4
编写本地实现代码  
 
在这部分我们要用C/C++语言实现java中定义的方法,我们在VC++中新建一个Project,然后创建一个HelloWorldImp.cpp文件,内容如下  
  #include   <jni.h>  
  #include   "HelloWorld.h"  
  #include   <stdio.h>  
   
  JNIEXPORT   void   JNICALL    
  Java_HelloWorld_displayHelloWorld(JNIEnv   *env,   jobject   obj)    
  {  
          printf("Hello   world!/n");  
          return;  
  }  
 
注意我们这里include   jni.h和刚才得到的HelloWorld.h文件。因此你要在VC++里面设置好,jni.hJAVA_HOME/include里面。编译通过后再生成hello.dll文件。    
5
  运行java程序  
 
把上面生成的hello.dll文件复制到我们的工作目录,这时候我们的目录中包括HelloWorld.javaHelloWorld.classhello.dll文件。运行java   HelloWorld命令,则可在控制台看到Hello   world|  
 
的输出了。

 

 

 

Linux下测试jni
1
、在测试用户下建立srclib目录
2
、进入src目录编写HelloWorld.java
   class HelloWorld {
   /* Native method declaration */
   public native void displayHelloWorld();
     /* Use static intializer */
      static {
         System.loadLibrary("hello");
      }
      /* Main function calls native method*/
      public static void main(String[] args) {
        new HelloWorld().displayHelloWorld();
      }
   }
3
、然后
javac HelloWorld.java
4
、使用 javah 工具生成 HelloWorld.h 文件

   javah HelloWorld
5
、编写HelloWorld.c
   #include <jni.h>;
   #include "HelloWorld.h"
   #include <stdio.h>;
   
   JNIEXPORT void JNICALL
   Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
   {
       printf("Hello world!/n");
       return;
   }
6
、编译c的动态库

   gcc -shared -o $HOME/lib/libhello.so HelloWorld.c
   
注意$HOME/lib目录要加入到环境变量LD_LIBRARY_PATH中去
7
java HelloWorld运行程序

 
原创粉丝点击