Android上的OpenGLES程序--开发环境介绍

我觉得这篇文章思路是对的, 随着项目的积累, 我发现这里面有些细节描述是不对的, 希望不要误导大家! 


几年前搞过一个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 <jni.h>
#include <android/log.h>

#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");
}

     这个函数在 create 函数中输出一个log, 好了运行, 成功了。

      但有三个小问题:

      (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的标准输出。 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值