几年前搞过一个Android项目, 对Android开发有个简单了解, OpenGLES 是嵌入式三维图形规范, 如果不在Android上做点东西,感觉有点遗憾。 从现在开始, 尝试写一套OpenGLES 的 Android 开发教程.
一: Android 开发环境和流程介绍:
1: Android 项目类型:
要开发一个Android应用, 从语言角度讲, 有三种类型: 一个是Java项目, 一个是java + c/c++混合项目(java 通过jni方式调用 c/c++ 的 so), 还有一个是c/c++项目(jni native-activity).
2: 编译工具:
需要 jdk , ubuntu环境下 1.8 版本以上手动下载安装, 1.8以下用命令行即可安装。
需要 android-sdk, 可以设置环境变量为 $ANDROID_SDK。
需要 android-ndk。 因为我要写 jni 项目, 所以需要NDK来生成 so, 可以设置环境变量为 $ANDROID_NDK。
需要 sudo apt-get install android-tools-adb, 即Android Debug Bridge, 它将apk 部署到手机上。
需要 sudo apt-get install ant 相当于 make, 编译成apk
3: 链接手机:
开发Android系统, 得有个真机啊, 模拟器太慢, 在Unbuntu下, 识别手机可通过下面这个方法设置
http://blog.csdn.net/zangle260/article/details/50579929
4: apk 生成的流程:
怎么由源码编译成apk, 部署到手机上的, 编译流程如下:
1: $ANDROID_SDK/tools/android update project --path , 这个步骤得到 build.xml, 我认为相当于执行cmake, 生成makefile的过程。
2: 如果是jni类型的项目, $ANDROID_NDK/ndk-build, 这个步骤把c/c++编译成 .so。
3: ant debug , 生成apk, 我认为相当于make的过程。
4: adb install bin/xxx.apk, 部署到手机上。
这是命令行下编译生成apk的过程, 我觉得开发工具背后也是用的这一系列步骤。
5: 开发工具:
使用开发工具可以一键编译部署到手机上, 集成工具有以下几个:
(1): adt-bundle-linux(15年以前的, 比较容易上手)
(2): android-studio(貌似是在adt-bundle 之后出来的)
(3): Eclipse + sdk + ndk + cdt (这个配置起来太繁琐)
二: java + jni 的一个实例
目录结构:
src: 存放项目java源代码
jni: 存放c/c++ 源代码, .mk
gen: app资源索引目录
assets: app数据目录
bin: 可执行文件目录, apk
libs: 第三方库目录 .jar, .so
res: app资源目录
AndroidMainfest.xml : 项目配置文件
我用的是这个 android-ndk-r9d/samples/hello-gl2 例子, 算上一个HelloWorld 吧
三: 遇到的问题:
当在eclipse中导入 jni的项目时, 不认c/c++头文件和语法, 我猜这应该是默认按不带jni的项目处理的。 这个问题可以这样解决:
四: 如何写jni程序
1: 创建java类
package com.android.gl2jni;
// Wrapper for native library
public class GL2JNILib {
static {
System.loadLibrary("gl2jni");
}
/**
* @param width the current view width
* @param height the current view height
*/
public static native void init(int width, int height);
public static native void step();
public static native void create();
}
2: 生成 .h 文件, 找到编译后的 .class 文件, 在其目录下或者包名目录下, 执行 javah , 生成.h文件, (注意 javah 后接完整类名, 注意用. 不能用/)
命令格式:
javah -jni-classpath/path/to/sdk/platforms/android-version/android.jar:bin/classes/-d jni/ com.xxx.xxx.classname
3: 实现 .h 中的定义函数
#include
#include
#define LOG_TAG "libgl2jni"
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
JNIEXPORT void JNICALL Java_com_android_gl2jni_GL2JNILib_create(JNIEnv * env, jclass obj)
{
LOGI("function: %s\n", "create");
}
但有三个小问题:
(1): 如何查看log, 有两种方法:
第一在eclipse中看,具体这样设置 : http://jingyan.baidu.com/article/7908e85c6b4a52af481ad2ee.html
第二在命令行中使用 adb logcat
(2): logcat 信息那么多, 如何过滤?
第一: 在eclipse中过滤 :http://blog.csdn.net/qq_23934247/article/details/52594545
第二: 在命令行中 使用 grep , adb logcat | grep function
(3): 为什么不直接用 printf, printf是c标准库中的一个函数, 经过系统调用,printf的输出设备可以是显示设备或者是个图形窗口, 对android activity来说, 就相当于我们建立一个窗口程序, 而不是终端控制台程序, 而这个图形窗口做为绘制图形界面来使用了, 不能当做printf的标准输出。