当前位置:操作系统 > 安卓/Android >>

如何在Android下使用JNI

 

1.引言

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

 

2.环境配置

2.1.安装jdk 1.6

(1)从jdk官方网站http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u29-download-513648.html下载jdk-6u29-linux-i586.bin文件。

 

(2)执行jdk安装文件

 

$ chmod a+x jdk-6u29-linux-i586.bin

 

$ jdk-6u29-linux-i586.bin

 

(3)配置jdk环境变量

 

$ sudo vim /etc/profile

 

 

 

#JAVA EVIRENMENT

 

export JAVA_HOME=/usr/lib/java/jdk1.6.0_29

 

export JRE_HOME=$JAVA_HOME/jre

 

export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH

 

export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

 

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

 

(4)验证安装

 

$ java -version

 

java version "1.6.0_29"

 

Java(TM) SE Runtime Environment (build 1.6.0_29-b11)

 

Java HotSpot(TM) Server VM (build 20.4-b02, mixed mode)

 

$ javah

 

用法:javah [选项] <类>

 

 

 

其中[选项] 包括:

 

 

 

-help 输出此帮助消息并退出

 

-classpath <路径> 用于装入类的路径

 

-bootclasspath <路径> 用于装入引导类的路径

 

-d <目录> 输出目录

 

-o <文件> 输出文件(只能使用-d 或-o 中的一个)

 

-jni 生成JNI样式的头文件(默认)

 

-version 输出版本信息

 

-verbose 启用详细输出

 

-force 始终写入输出文件

 

 

 

使用全限定名称指定<类>(例

 

如,java.lang.Object)。

 

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

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

 

(1)Eclipse

 

(2)AVD

 

(3)Android SDK

 

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

 

 

 

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

 

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

 

$ sudo vim /etc/profile

 

export PATH=~/software/android/android-sdk-linux/tools:$PATH

 

export PATH=~/software/android/android-sdk-linux/platform-tools:$PATH

 

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

 

 

 

2.3.安装NDK

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

 

(1)从android ndk官网http://developer.android.com/sdk/ndk/index.html下载ndk,目前最新版本为android-ndk-r6b-linux-x86.tar.bz2.

 

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

 

 

 

$ tar -xvf android-ndk-r6b-linux-x86.tar.bz2

 

$ sudo mv android-ndk-r6b /usr/local/ndk

 

(3)设置ndk环境变量

 

$ sudo vim /etc/profile

 

export PATH=/usr/local/ndk:$PATH

 

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

 

(4)验证安装

 

$ cd /usr/local/ndk/samples/hello-jni/

 

$ ndk-build

 

Gdbserver : [arm-linux-androideabi-4.4.3] libs/armeabi/gdbserver

 

Gdbsetup : libs/armeabi/gdb.setup

 

Install : libhello-jni.so => libs/armeabi/libhello-jni.so

 

 

 

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

 

 

 

<?xml version="1.0" encoding="utf-8"?>

 

<resources>

 

<stringname="hello">Hello World, JNITestActivity!</string>

 

<string name="app_name">JNITest</string>

 

<string name="btn_show">Show</string>

 

</resources>

 

 

 

 

 

 

 

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

 

 

 

<?xmlversion="1.0"encoding="utf-8"?>

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

 

android:layout_width="fill_parent"

 

android:layout_height="fill_parent"

 

android:orientation="vertical" >

 

 

 

<TextView

 

android:layout_width="fill_parent"

 

android:layout_height="wrap_content"

 

android:text="@string/hello" />

 

 

 

<EditText

 

android:id="@+id/ed_name"

 

android:layout_width="match_parent"

 

android:layout_height="wrap_content"

 

android:layout_gravity="center_horizontal"

 

android:layout_marginLeft="5dp"

 

android:layout_marginRight="5dp" />

 

 

 

<Button

 

android:id="@+id/btn_show"

 

android:layout_width="109dp"

 

android:layout_height="wrap_content"

 

android:layout_gravity="center_horizontal"

 

android:text="@string/btn_show" />

 

 

 

</LinearLayout>

 

 

 

 

 

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

 

 

 

 

 

 

 

(3)编辑JNITest.java文件

 

package org.tonny.jni;

 

 

 

import android.app.Activity;

 

import android.os.Bundle;

 

补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,