歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android中JNI的使用之一:Java原生JNI的使用、javah指令的使用以及圖解教材

Java Nativie Interface(JNI,中文名稱Java本地接口)標准時Java平台的一部分,它允許Java代碼和其他語言寫得代碼進行交互。JNI是本地編程接口,它使得Java虛擬機(VM)內部運行的Java代碼能夠用其他編程語言(如C、C++和匯編語言)編寫的應用程序和庫進行交互操作。JNI的主要用途是為了對硬件進行訪問以及追求高效率或可重用C/C++庫。

Android系統中采用了JNI的方式來調用C/C++方法,然而,在Android系統裡進一步加強了Java JNI的使用,使JNI的調用更具有效率。因此,總的來說,Android系統裡可以采用兩種方式來使用JNI。第一種:Java原生JNI,使用dll等動態鏈接庫 ;第二種,Android加強版JNI,通過動態加載*.so鏈接庫來進行JNI調用。今天,我們分析第一種JNI使用方式,也稱得上是JNI入門。

由於Java與其他編程語言采用的語法不同,為了讓Java與C/C++庫函數能進行通信,約定的一個參數類型映射如下:

                Java類型              C/C++類型

                 void                       void

                 jboolean                boolean

                 jint                         int

                 jlong                      long

                 jdouble                  double

                 jfloat                      float

                 jbyte                      jbyte

                 jchar                     char

                 jshort                     shor

       上面的只是簡單類型的一個映射,後面我們會完善其他參數類型的映射。

      

       開發環境介紹(Windows下):

            Eclipse:                   主要用來創建Java工程

            MicrosoftVC++6.0:  生成動態鏈接庫供相應的Java文件加載

 

一、使用Eclipse創建Java工程

        本例中,我們簡單的創建了一個Java工程HelloBabyJNI,工程絕對路徑位於E:\MyCode\AndroidCode\HelloBabyJNI路徑下, 主文件路徑位於\src\lover\hellojni路徑下(路徑對後面的javah編譯很重要)

         HelloBabyJNI.java文件如下:

           

[java]
  1. package com.lover.hellojni;  
  2.   
  3. /** 
  4.  * 一個簡單的Java JNI實例 
  5.  *  
  6.  */  
  7. public class HelloBabyJNI {  
  8.   
  9.     /* 
  10.      * 靜態構造函數,動態加載HelloBabyJNI動態庫,其dll文件名為:HelloBabyJNI.dll --->由MSVC6.0軟件創建 
  11.      */  
  12.     static {  
  13.         System.load("E:/HelloBabyJNI.dll");  // 可能需要 dll鏈接庫的絕對存放路徑   
  14.     }  
  15.   
  16.     /* 
  17.      * 在Java中注冊需要調用的C/C++本地方法(native method),也就是需要C/C++來實現的方法 
  18.      */  
  19.     public native int add(int a, int b);  
  20.   
  21.     // main方法,加載動態庫來調用C/C++本地方法   
  22.     public static void main(String[] args) {  
  23.         HelloBabyJNI helloBabyJNI = new HelloBabyJNI();  
  24.         // 調用注冊的add方法來得到返回值   
  25.         int result = helloBabyJNI.add(23);  
  26.         // 輸出   
  27.         System.out.println("after invoke the native method,the result is "+ result);  
  28.     }  
  29. }  

 

      2,編譯HelloBabyJNI.java文件,生成HelloBabyJNI.class文件,位於路徑\src\lover\hellojni\HelloBabyJNI.class

   

       3,使用javah指令編譯HelloBabyJNI.class文件,生成Java與C/C++之間進行通信的約定接口,它規定了Java中nativemethod在C/C++的具體接口。運行cmd後,進入於E:\MyCode\AndroidCode\HelloBabyJNI\src路徑下,使用javah指令,指令集形式如下:

        javah  -classpath   E:\MyCode\AndroidCode\HelloBabyJNI\src -jni  com.lover.hellojni.HelloBabyJNI,具體指令用法可以參考javah –help,本文只是重應用上。

           如圖所示:

               

Copyright © Linux教程網 All Rights Reserved