Android中JNI的使用之一:Java原生JNI的使用以及图解教材


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文件如下:

  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,本文只是重应用上。

如图所示:

                    

  • 1
  • 2
  • 3
  • 下一页

相关内容