eclipseandroidndk
❶ 如何在Android下使用JNI
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安装文件
[html] view plainprint?
01.$chmod a+x jdk-6u29-linux-i586.bin
02.$jdk-6u29-linux-i586.bin
$chmod a+x jdk-6u29-linux-i586.bin
$jdk-6u29-linux-i586.bin
(3)配置jdk环境变量
[html] view plainprint?
01.$sudo vim /etc/profile
02.#JAVAEVIRENMENT
03.exportJAVA_HOME=/usr/lib/java/jdk1.6.0_29
04.exportJRE_HOME=$JAVA_HOME/jre
05.exportCLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
06.exportPATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
$sudo vim /etc/profile
#JAVAEVIRENMENT
exportJAVA_HOME=/usr/lib/java/jdk1.6.0_29
exportJRE_HOME=$JAVA_HOME/jre
exportCLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
exportPATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
保存后退出编辑,并重启系统。
(4)验证安装
[html] view plainprint?
01.$java -version
02.javaversion "1.6.0_29"
03.Java(TM)SE Runtime Environment (build 1.6.0_29-b11)
04.JavaHotSpot(TM) Server VM (build 20.4-b02, mixed mode)
05.$javah
06.用法:javah[选项]<类>
07.其中[选项]包括:
08.-help输出此帮助消息并退出
09.-classpath<路径>用于装入类的路径
10.-bootclasspath<路径>用于装入引导类的路径
11.-d<目录>输出目录
12.-o<文件>输出文件(只能使用-d或-o中的一个)
13.-jni生成JNI样式的头文件(默认)
14.-version输出版本信息
15.-verbose启用详细输出
16.-force始终写入输出文件
17.使用全限定名称指定<类>(例
18.如,java.lang.Object)。
$java -version
javaversion "1.6.0_29"
Java(TM)SE Runtime Environment (build 1.6.0_29-b11)
JavaHotSpot(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)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的解压目录。
[plain] view plainprint?
01.$sudo vim /etc/profile
02.exportPATH=~/software/android/android-sdk-linux/tools:$PATH
03. exportPATH=~/software/android/android-sdk-linux/platform-tools:$PATH
$sudo vim /etc/profile
exportPATH=~/software/android/android-sdk-linux/tools:$PATH
exportPATH=~/software/android/android-sdk-linux/platform-tools:$PATH
编辑完毕后退出,并重启生效。
2.3.安装NDK
NDK是由android提供的编译android本地代码的一个工具。
(1)从androidndk官网http://developer.android.com/sdk/ndk/index.html下载ndk,目前最新版本为android-ndk-r6b-linux-x86.tar.bz2.
(2)解压ndk到工作目录:
[plain] view plainprint?
01.$tar -xvf android-ndk-r6b-linux-x86.tar.bz2
02.$sudo mv android-ndk-r6b /usr/local/ndk
$tar -xvf android-ndk-r6b-linux-x86.tar.bz2
$sudo mv android-ndk-r6b /usr/local/ndk
(3)设置ndk环境变量
[plain] view plainprint?
01.$sudo vim /etc/profile
02.exportPATH=/usr/local/ndk:$PATH
$sudo vim /etc/profile
exportPATH=/usr/local/ndk:$PATH
编辑完毕后保存退出,并重启生效
(4)验证安装
[plain] view plainprint?
01.$ cd/usr/local/ndk/samples/hello-jni/
02.$ ndk-build
03.Gdbserver : [arm-linux-androideabi-4.4.3] libs/armeabi/gdbserver
04.Gdbsetup : libs/armeabi/gdb.setup
05.Install : libhello-jni.so => libs/armeabi/libhello-jni.so
$ 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文件如下:编辑res/layout/main.xml文件
我们在主界面上添加了一个EditText控件和一个Button控件。
(3)编辑JNITest.java文件
static表示在系统第一次加载类的时候,先执行这一段代码,在这里表示加载动态库libJNITest.so文件。
再看这一段:
[java] view plainprint?
01.privatenativeString GetReply();
privatenativeString GetReply();
native表示这个方法由本地代码定义,需要通过jni接口调用本地c/c++代码。
[java] view plainprint?
01.publicvoidonClick(View arg0) {
02.edtName.setText(reply);
03.}
publicvoidonClick(View arg0) {
edtName.setText(reply);
}
这段代码表示点击按钮后,把native方法的返回的字符串显示到EditText控件。
(4)编译工程,生成.class文件。
3.2.用javah工具生成符合JNI规范的c语言头文件
在终端中,进入android工程所在的bin目录
[plain] view plainprint?
01.$cd ~/project/Android/JNITest/bin
$cd ~/project/Android/JNITest/bin
我们用ls命令查看,可以看到bin目录下有个classes目录,其目录结构为classes/org/tonny/jni,即classes的子目录结构是android工程的包名org.tonny.jni。请注意,下面我们准备执行javah命令的时候,必须进入到org/tonny/jni的上级目录,即classes目录,否则javah会提示找不到相关的java类。
下面继续:
[plain] view plainprint?
01.$cd classes
02.$javah org.tonny.jni.JNITest
03.$ls
04.org org_tonny_jni_JNITest.h
$cd classes
$javah org.tonny.jni.JNITest
$ls
org org_tonny_jni_JNITest.h
执行javahorg.tonny.jni.JNITest命令,在classes目录下会生成org_tonny_jni_JNITest.h头文件。如果不进入到classes目录下的话,也可以这样:
[plain] view plainprint?
01.$javah -classpath ~/project/Android/JNITest/bin/classesorg.tonny.jni.JNITest
$javah -classpath ~/project/Android/JNITest/bin/classesorg.tonny.jni.JNITest
-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文件,编辑代码如下:
[cpp] view plainprint?
01.#include<jni.h>
02.#include<string.h>
03.#include"org_tonny_jni_JNITest.h"
04.
05.
06.JNIEXPORTjstring JNICALLJava_org_tonny_jni_JNITest_GetReply
07.(JNIEnv *env, jobject obj){
08.return(*env)->NewStringUTF(env,(char*)"Hello,JNITest");
09.}
#include<jni.h>
#include<string.h>
#include"org_tonny_jni_JNITest.h"
JNIEXPORTjstring JNICALLJava_org_tonny_jni_JNITest_GetReply
(JNIEnv *env, jobject obj){
return(*env)->NewStringUTF(env,(char*)"Hello,JNITest");
}
我们可以看到,该函数的实现相当简单,返回一个字符串为:"Hello,JNITest"
3.4.编写Android.mk文件
在~/project/Android/JNITest/jni目录下新建Android.mk文件,android可以根据这个文件的编译参数编译模块。编辑Android.mk文件如下:
[plain] view plainprint?
01.LOCAL_PATH:= $(call my-dir)
02.include$(CLEAR_VARS)
03.LOCAL_MODULE := libJNITest
04.LOCAL_SRC_FILES:= org_tonny_jni_JNITest.c
05.include$(BUILD_SHARED_LIBRARY)
LOCAL_PATH:= $(call my-dir)
include$(CLEAR_VARS)
LOCAL_MODULE := libJNITest
LOCAL_SRC_FILES:= org_tonny_jni_JNITest.c
include$(BUILD_SHARED_LIBRARY)
LOCAL_MODULE表示编译的动态库名称
LOCAL_SRC_FILES 表示源代码文件
3.5.用ndk工具编译并生成.so文件
进入到JNITest的工程目录,执行ndk-build命令即可生成libJNITest.so文件。
[plain] view plainprint?
01.$cd ~/project/Android/JNITest/
02.$ndk-build
03.Invalidattribute name:
04.package
05.Install : libJNITest.so => libs/armeabi/libJNITest.so
$cd ~/project/Android/JNITest/
$ndk-build
Invalidattribute name:
package
Install : libJNITest.so => libs/armeabi/libJNITest.so
可以看到,在工程目录的libs/armeabi目录下生成了libJNITest.so文件。
3.6.在模拟器上运行
(1)首先,我们把android模拟器启动起来。进入到emulator所在目录,执行emulator命令:
[plain] view plainprint?
01.$cd ~/software/android/android-sdk-linux/tools
02.$./emulator @AVD-2.3.3-V10 -partition-size 512
$cd ~/software/android/android-sdk-linux/tools
$./emulator @AVD-2.3.3-V10 -partition-size 512
AVD-2.3.3-V10表示你的模拟器名称,与在Eclipse->AVDManager下的AVDName对应,-partition-size表示模拟器的存储设备容量。
(2)接下来,我们需要把libJNITest.so文件拷贝到模拟器的/system/lib目录下,执行以下命令:
[plain] view plainprint?
01.$cd ~/project/Android/JNITest/libs/armeabi/
02.$adb remount
03.$adb push libJNITest.so /system/lib
04.80 KB/s (10084 bytes in 0.121s)
$cd ~/project/Android/JNITest/libs/armeabi/
$adb remount
$adb push libJNITest.so /system/lib
80 KB/s (10084 bytes in 0.121s)
当在终端上看到有80 KB/s (10084 bytes in 0.121s)传输速度等信息的时候,说明拷贝成功。
(3)在终端上执行JNITest程序,这个我们可以在Eclipse下,右键点击JNITest工程,RunAs->Android Application,即可在模拟器上启动程序
❷ Android应用开发揭秘的图书目录
前言
第一部分 准备篇
第1章 Android开发简介
1.1 Android基本概念
1.1.1 Android简介
1.1.2 Android的系统构架
1.1.3 Android应用程序框架
1.2 OMS介绍
1.2.1 OPhone介绍
1.2.2 Widget介绍
1.3 小结
第2章 Android开发环境搭建
2.1 Android开发准备工作
2.2 开发包及其工具的安装和配置
2.2.1 安装JDK和配置Java开发环境
2.2.2 Eclipse的安装与汉化
2.2.3 SDK和ADT的安装和配置
2.3 创建第一个Android项目——HeUoAndroid
2.3.1 创建HelloAndroid项目
2.3.2 运行HelloAndroid及模拟器的使用
2.3.3 调试HelloAndroid
2.4 小结
第二部分 基础篇
第3章 Android程序设计基础
3.1 Android程序框架
3.1.1 Android项目目录结构
3.1.2 Android应用解析
3.2 Android的生命周期
3.3 Android程序U设计
3.4 小结
第4章 用户界面开发
4.1 用户界面开发详解
4.1.1 用户界面简介
4.1.2 事件处理
4.2 常用控件应用
4.2.1 文本框(Textiew)
4.2.2 列表(ListView)
4.2.3 提示(T0ast)
4.2.4 编辑框(EditText)
4.2.5 单项选择(RadioGroup、RadioButton
4.2.6 多项选择(CheckBox)
4.2.7 下拉列表(Spinner)
4.2.8 自动提示(AutoComplete.TextⅥew)
4.2.9 日期和时间(DatePicker、TimePicker)
4.2.10 按钮(Button)
4.2.1l 菜单(Menu)
4.2.12 对话框(Dialog)
4.2.13 图片视图(ImageView)
4.2.14 带图标的按钮(ImageButton)
4.2.15 拖动效果(Gallery)
4.2.16 切换图片(hmgeSwilcher)
4.2.17 网格视图(GridView)
4.2.18 卷轴视图(ScrollView)
4.2.19 进度条(ProgressBar)
4.2.20 拖动条(SeekBar)
4.2.21 状态栏提示(Notification、NotificationManager)
4.2.22 对话框中的进度条(ProgressDialog)
4.3 界面布局
4.3.1 垂直线性布局
4.3.2 水平线性布局
4.3.3.相对布局(RelativeLayout)
4.3.4 表单布局(TableLayout)
4.3.5 切换卡(TabWidget)
4,4 小结
第5章 Android游戏开发
5.1 Android游戏开发框架
5.1.1 View类开发框架
5.1.2 SurfaceView类开发框架
5.2 Graphics类开发
5.5.1 Paint和Color类介绍
5.2.2 Canvas类介绍
5.2.3 几何图形绘制
5.2.4 字符串绘制
5.2.5 图像绘制
5.2.6 图像旋转
5.2.7 图像缩放
5.2.8 图像像素操作
5.2.9 Shader类介绍
5.2.10 双缓冲技术
5.2.11 全屏显示
5.2.12 获得屏幕属性
5.3 动画实现
5.3.1 Tween动画
5.3.2 Frame动画
5.3.3 GIF动画播放
5.4 小结
第6章 Android数据存储
6.1 Android数据存储初探
6.2 数据存储之Shared Preferences
6.3 数据存储之Files
6.4 数据存储之Network
6.5 Android数据库编程
6.5.1 SQLite简介
6.5.2 SQLite编程详解
6.5.3 SQLiteOpenHelper应用
6.6 数据共享(ContentProviders)
6.7 小结
第7 章多媒体开发
7.1 多媒体开发详解
7.1.1 Open Core
7.1.2 MediaPlayer
7.1.3 MediaRecorder
7.2 播放音乐
7.3 播放视频
7.4 录制歌曲
7.5 相机设置
7.6 闹钟设置
7.7 铃声设置
7.8 小结
第8章 网络与通信
8.1 网络通信基础
8.1.1 无线网络技术
8.1.2 Android网络基础
8.2 HTTP通信
8.2.1 HttpURLConnection接口
8.2.2 HttpClient接口
8.2.3 实时更新
8.3 Socket通信
8.3.1 Socket基础
8.3.2 Socket应用(简易聊天室)
8.4 网络通信的中文乱码问题
8.5 WebKit应用
8.5.1 WebKjt概述
8.5.2 WebView浏览网页
8.5.3 WebView与Javascript
8.6 WtFi介绍
8.7 蓝牙
8.8 小结
第9章 Android特色开发
9.1 传感器
9.2 语音识别
9.3 GoogleMap
9.3.1 GoogleMap概述
9.3.2 准备工作
9.3.3 GoogleMapAPI的使用
9.3.4 定位系统
9.4 桌面组件
9.4.1 快捷方式
9.4.2 实时文件夹
9.4.3 Widget开发
9.5 账户管理
9.6 小结
第三部分 实例篇
第10章 Android应用开发实例
10.1 情境模式
10.2 文件管理器
10.3 通讯录
10.4 音乐播放器
10.5 天气预报
10.6 个人地图
10.7 Widget日历
10.8 小结
第11 章Android游戏开发实例
11.1 手机游戏开发简介
11.2 游戏框架设计
11.3 地图设计
11.4 主角设计
11.5 图层管理器
11.6 游戏音效
11.7 游戏存档
11.8 小结
第四部分 高级篇
第12章 AndroidOpenGL开发基础
12.1 OpenGL简介
12.2 多边形
12.3 颜色
12.4 旋转
12.5 3D 空间
12.6 纹理映射
12.7 光照和事件
12.8 混合
12.9 小结
第13章 AndroidOpenGL综合应用
13.1 移动图像
13.2.3D 世界
13.3 飘动的旗帜
13.4 显示列表
13.5 雾
13.6 粒子系统
13.7 蒙版
13.8 变形
13.9 小结
第14章 游戏引擎实现
14.1 游戏引擎介绍
14.1.1 什么是引擎
14.1.2 引擎的进化
14.1.3 常见的游戏引擎
14.1.4 Android游戏引擎
14.2 游戏引擎结构
14.2.1 游戏引擎原理
14.2.2 游戏引擎定位
14.2.3 游戏引擎框架
14.3 游戏引擎设计
14.3.1 游戏引擎结构和功能设计
14.3.2 游戏引擎设计注意事项
14.4 游戏引擎实现
14.4.1 Activity类实现
14.4.2 流程控制和线程
14.4.3 游戏对象与对象管理
14.4.4 图形引擎
14.4.5 物理引擎
14.4.6 事件模块
14.4.7 工具模块
14.4.8 脚本引擎、音效模块、网络模块
14.5 小结
第15章 优化技术
15.1 优化的基本知识
15.1.1 如何书写出优秀代码
15.1.2 编程规范
15.2 程序性能测试
15.2.1 计算性能测试
15.2.2 内存消耗测试
15.3 初级优化
15.4 高级优化
15.5 Android高效开发
15.6 AndroidUI优化
15.7 其他优化
15.7.1 zipalign
15.7.2 图片优化
15.8 小结
第五部分 扩展篇
第16章 Android NDK开发
16.1 AndroidNDK简介
16.2 安装和配置NDK开发环境
16.2.1 系统和软件需求
16.2.2 NDK开发环境搭建
16.2.3 编译第一个NDK程序
16.3 AndroidNDK开发
16.3.1 JNI接口设计
16.3.2 使用CC++实现本地方法
16.3 编译CC++代码
16.4 AndroidNDK中使用0penGL
16.5小结
第17章 Android脚本环境
17.1 Android脚本环境简介
17.2 Android脚本环境安装
17.3如何编写Android脚本程序
17.4小结