如何在Android操作系统下使用JNI开发

    作者:课课家教育更新于: 2019-04-02 11:21:27

      在Android操作系统下如何使用JNI开发使我们要学习的众多Android开发课程中的一个小点,那么JNI是什么呢,简单介绍下JNI。JNI是java Native Interface的缩写,中文为JAVA本地调用。它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。使用java与本地已编译的代码交互,通常会丧失平台可移植性。JNI支持一个"调用接口"(invocation interface),它允许你把一个JVM嵌入到本地程序中。本地程序可以链接一个实现了JVM的本地库,然后使用"调用接口"执行JAVA语言编写的软件模块。

    如何在Android操作系统下使用JNI开发_android_jni_java_课课家

      1.引言

      我们知道,Android系统的底层库由c/c++编写,上层Android应用程序通过Java虚拟机调用底层接口,衔接底层c/c++库与Java应用程序间的接口正是JNI(JavaNative Interface)。本文描述了如何在ubuntu下配置AndroidJNI的开发环境,以及如何编写一个简单的c函数库和JNI接口,并通过编写Java程序调用这些接口,最终运行在模拟器上的过程。

      2.环境配置

      2.1.安装jdk1.6

      (1)从jdk官方网站下载jdk-6u29-Linux-i586.bin文件。

      (2)执行jdk安装文件

      (3)配置jdk环境变量

      保存后退出编辑,并重启系统。

      (4)验证安装

      2.2.安装android应用程序开发环境

      ubuntu下安装android应用程序开发环境与Windows类似,依次安装好以下软件即可:

      (1)Eclipse

      (2)ADT

      (3)AndroidSDK

      与windows下安装唯一不同的一点是,下载这些软件的时候要下载Linux版本的安装包。

      安装好以上android应用程序的开发环境后,还可以选择是否需要配置emulator和adb工具的环境变量,以方便在进行JNI开发的时候使用。配置步骤如下:

      把emulator所在目录android-sdk-linux/tools以及adb所在目录android-sdk-linux/platform-tools添加到环境变量中,android-sdk-linux指androidsdk安装包android-sdk_rxx-linux的解压目录。

      编辑完毕后退出,并重启生效。

      2.3.安装NDK

      NDK是由android提供的编译android本地代码的一个工具。

      (1)从androidndk官网l下载ndk,目前最新版本为android-ndk-r6b-linux-x86.tar.bz2.

      (2)解压ndk到工作目录:

      (3)设置ndk环境变量

      编辑完毕后保存退出,并重启生效

      (4)验证安装

      3.JNI实现

      我们需要定义一个符合JNI接口规范的c/c++接口,这个接口不用太复杂,例如输出一个字符串。接下来,则需要把c/c++接口的代码文件编译成共享库(动态库).so文件,并放到模拟器的相关目录下。最后,启动Java应用程序,就可以看到最终效果了。

      3.1.编写Java应用程序代码

      (1)启动Eclipse,新建android工程

      Project:JNITest

      Package:org.tonny.jni

      Activity:JNITest

      (2)编辑资源文件

      编辑res/values/strings.xml文件如下:

      编辑res/layout/main.xml文件如下:

      我们在主界面上添加了一个EditText控件和一个Button控件。

      (3)编辑JNITest.java文件

      我们看这一段代码:

      static表示在系统第一次加载类的时候,先执行这一段代码,在这里表示加载动态库libJNITest.so文件。

      再看这一段:

      native表示这个方法由本地代码定义,需要通过jni接口调用本地c/c++代码。

      这段代码表示点击按钮后,把native方法的返回的字符串显示到EditText控件。

      (4)编译工程,生成.class文件。

      3.2.用javah工具生成符合JNI规范的C语言头文件

      在终端中,进入android工程所在的bin目录

      我们用ls命令查看,可以看到bin目录下有个classes目录,其目录结构为classes/org/tonny/jni,即classes的子目录结构是android工程的包名org.tonny.jni。请注意,下面我们准备执行javah命令的时候,必须进入到org/tonny/jni的上级目录,即classes目录,否则javah会提示找不到相关的java类。

      下面继续:

      执行javahorg.tonny.jni.JNITest命令,在classes目录下会生成org_tonny_jni_JNITest.h头文件。如果不进入到classes目录下的话,也可以这样:

      -classpath 参数表示装载类的目录。

      3.3.编写c/c++代码

      生成org_tonny_jni_JNITest.h头文件后,我们就可以编写相应的函数代码了。下面在android工程目录下新建jni目录,即~/project/Android/JNITest/jni,把org_tonny_jni_JNITest.h头文件拷贝到jni目录下,并在jni目录下新建org_tonny_jni_JNITest.c文件,编辑代码如下:

      我们可以看到,该函数的实现相当简单,返回一个字符串为:"Hello,JNITest"

      3.4.编写Android.mk文件

      在~/project/Android/JNITest/jni目录下新建Android.mk文件,android可以根据这个文件的编译参数编译模块。编辑Android.mk文件如下:

      LOCAL_MODULE表示编译的动态库名称

      LOCAL_SRC_FILES 表示源代码文件

      3.5.用ndk工具编译并生成.so文件

      进入到JNITest的工程目录,执行ndk-build命令即可生成libJNITest.so文件。

      可以看到,在工程目录的libs/armeabi目录下生成了libJNITest.so文件。

      3.6.在模拟器上运行

      (1)首先,我们把android模拟器启动起来。进入到emulator所在目录,执行emulator命令:

      AVD-2.3.3-V10表示你的模拟器名称,与在Eclipse->AVDManager下的AVDName对应,-partition-size表示模拟器的存储设备容量。

      (2)接下来,我们需要把libJNITest.so文件拷贝到模拟器的/system/lib目录下,执行以下命令:

      当在终端上看到有80 KB/s (10084 bytes in 0.121s)传输速度等信息的时候,说明拷贝成功。

      (3)在终端上执行JNITest程序,这个我们可以在Eclipse下,右键点击JNITest工程,RunAs->Android Application,即可在模拟器上启动程序,执行效果如下:

      在模拟器上点击【Show】按钮,即可看到Hello,JNITest,而这个字符串正是我们在org_tonny_jni_JNITest.c代码文件中所定义的。

      OK,现在大功告成!

      4.参考文章

      AndroidJNI开发入门之一

      AndroidJni代码示例讲解

          本文通过两大点来介绍JNI相关知识,一是环境配置,环境的配置又从软件下载安装等环境配置来写,第二点是写JNI的相关知识,主要是写JNI的编写Java应用程序代码、编写c/c++代码、用javah工具生成符合JNI规范的c语言头文件、在模拟器上运行、用ndk工具编译并生成.so文件和编写Android.mk文件这六个方面来写。

    标签: androidjnijava

课课家教育

未登录